0

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

有没有其他方法可以做到这一点,或者已经可以使用它了吗?

4

2 回答 2

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'

于 2012-11-08T03:04:39.603 回答
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
于 2012-11-08T03:04:59.823 回答