Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较MySQL中格式化字符串中的数字?_Mysql_Sql - Fatal编程技术网

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

比较MySQL中格式化字符串中的数字?,mysql,sql,Mysql,Sql,我在MySQL的表中有一个PolicyNo列,格式如下: XXXX-000000 XXXX-000001 XXXX-000002 XXXX-000003 ... 四个大写字母字符,后跟一个破折号和一个六位数字 六位数字是递增的,为下一行添加1,并且所有行的四个字符的长度始终相同。PolicyNo列是唯一的,其类型为varchar(11) 如果订购,它将如下所示: XXXX-000000 XXXX-000001 XXXX-000002 XXXX-000003 ... 现在我想获取所有的Po

我在MySQL的表中有一个
PolicyNo
列,格式如下:

XXXX-000000
XXXX-000001
XXXX-000002
XXXX-000003
...
四个大写字母字符,后跟一个破折号和一个六位数字

六位数字是递增的,为下一行添加
1
,并且所有行的四个字符的长度始终相同。
PolicyNo
列是唯一的,其类型为
varchar(11)

如果订购,它将如下所示:

XXXX-000000
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提供的子字符串函数,如下面的查询

从表1中选择count(*),其中子字符串(policyNo,6)>您的_范围

这里6作为从第6位开始的6位数字传递,如果您确实想传递初始4位字符,那么您可以使用以下查询。此处第二个where条款将从保单编号中提取最初的4个字母


从表1中选择count(*),其中子字符串(policyNo,6)>您的_范围和子字符串(policyNo,1,4)=‘ABCD’

因为您的数字是零填充的,只要四个字母的前缀相同且长度始终相同,那么这应该可以像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