比较MySQL格式化字符串中的数字?

时间:2012-11-08 02:50:30

标签: mysql sql

我在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 |
+-------------------------------+-------------------------------+-------------------------------+

还有其他方法可以做到这一点还是可以使用它?

2 个答案:

答案 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