我的 MySQL 表中有一个 PolicyNo
列,其格式如下:
XXXX-000000
四个大写字符,后跟一个破折号和一个六位数字。
六位数字是递增的,为下一行添加1
,并且所有行的四个字符始终相同。 PolicyNo
列是唯一的,类型为 varchar(11)
。
如果订购,它将如下所示:
XXXX-000001
XXXX-000002
XXXX-000003
...
现在我想获取所有编号大于指定编号的PolicyNo
。
例如:检索所有大于'XXXX-000100'
的PolicyNo
:
XXXX-000101
XXXX-000102
XXXX-000103
...
我测试了这个查询,它工作正常,但我只是不知道这样做是否真的安全:
SELECT 'XXXX-000099' > 'XXXX-000098'
, 'XXXX-000099' > 'XXXX-000100'
, 'XXXX-000099' > 'XXXX-000101'
Result:
+-------------------------------+-------------------------------+-------------------------------+
| 'XXXX-000099' > 'XXXX-000098' | 'XXXX-000099' > 'XXXX-000100' | 'XXXX-000099' > 'XXXX-000101' |
+-------------------------------+-------------------------------+-------------------------------+
| 1 | 0 | 0 |
+-------------------------------+-------------------------------+-------------------------------+
还有其他方法可以做到这一点吗?或者已经可以使用它了吗?
最佳答案
因为你的数字是零填充的,只要四个字母前缀相同并且总是相同的长度,那么这应该可以工作,因为MySQL将进行字典顺序比较。
请注意,填充中少一个 0
将导致此失败:
SET @policy1 = 'XXXX-00099';
SET @policy2 = 'XXXX-000598';
SELECT @policy1, @policy2, @policy1 > @policy2 AS comparison;
=========================================
> 'XXXX-00099', 'XXXX-000598', 1
如果你需要真正比较最后的数字,你需要解析它们并转换它们:
SET @policy1 = 'XXXX-00099';
SET @policy2 = 'XXXX-000598';
SELECT @policy1, @policy2,
CONVERT(SUBSTRING(@policy2, INSTR(@policy2, '-')+1), UNSIGNED) >
CONVERT(SUBSTRING(@policy2, INSTR(@policy2, '-')+1), UNSIGNED) AS comparison;
=========================================
> 'XXXX-00099', 'XXXX-000598', 0
关于mysql - 比较MySQL中格式化字符串中的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13281693/