我在MySQL的表格中有一个PolicyNo
列,其格式如下:
XXXX-000000
四个大写字母字符,后跟短划线和六位数字。
六位数字是增量的,为下一行添加1
,并且所有行的四个字符始终相同。 PolicyNo
列是唯一的,类型为varchar(11)
。
如果订购,它将如下所示:
XXXX-000001
XXXX-000002
XXXX-000003
...
现在我希望得到数量大于指定数字的所有PolicyNo
。
例如:检索大于PolicyNo
的所有'XXXX-000100'
:
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 |
+-------------------------------+-------------------------------+-------------------------------+
还有其他方法可以做到这一点还是可以使用它?
答案 0 :(得分:1)
您也可以使用MySQL提供的SUBSTRING功能,如下面的查询。
SELECT count(*)FROM Table1 where substring(policyNo,6)> YOUR_RANGE;
这里6作为6位数从第6位开始传递如果你确实想要传递最初的4个字符,那么你可以使用以下查询。这里的第二个where子句将从policyNo中获取4个字母。
SELECT count(*)FROM Table1 where substring(policyNo,6)> YOUR_RANGE AND substring(policyNo,1,4)='ABCD'
答案 1 :(得分:1)
因为你的数字是零填充的,只要四个字母的前缀是相同的并且总是相同的长度,那么这应该可以用,因为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