4

我的数据库表中有一个字母数字列。对于我的过滤器,我使用 between 来获取结果过滤器值。一切正常。但是,在某些情况下,它会遗漏一些过滤数据。这是我的样品,

样本数据

ACQPO14
002421
ACQPO8
ACQPO14
ACQPO19
DUMMY0001

Sql 查询

SELECT po.No,
   po.PoS
FROM PoDetails pod
INNER JOIN Pors po ON po.Id=PoD.PoId
WHERE po.No BETWEEN 'ACQPO1' AND 'ACQPO20'

对于上述示例。该查询仅返回ACQPO14ACQPO19 NOT ACQPO8

对此问题的任何帮助将不胜感激。

谢谢

4

5 回答 5

1

这是有道理的,因为它只是文本。

1在此之前8,在文本中排序(从左到右),db 将忽略 的最后一位ACQPO14来与ACQPO8. 所以ACQPO1( 4removed) 出现在前面ACQPO8ACQPO2( 0removed)ACQPO8也出现在前面。所以它被过滤掉了between

解决此问题的唯一方法是通过拆分列来解析它。EG:如果ACQPO是一个固定长度的前缀,您可以使用一些 DBMS 函数(您没有指定任何)来修剪该部分并将其余部分转换为数字格式。然后按该数字余数进行比较/过滤。

于 2013-10-11T04:59:16.197 回答
0

如果 ACQPO 已修复,请在 SQL Server 中尝试以下操作

SELECT po.No, po.PoS
FROM PoDetails pod
INNER JOIN Pors po ON po.Id=PoD.PoId
WHERE left(po.No,5) and 
cast(substring(po.No,6,len(po.No)) as int)
BETWEEN cast(substring('ACQPO1',6,len(po.No)) as int)  AND cast(substring('ACQPO20',6,len(po.No)) as int)


SELECT substring(data,6,len(data)),* FROM #Temp Where 
left(data,5) ='ACQPO' And 
cast(substring(data,6,len(data)) as int)
BETWEEN cast(substring('ACQPO1',6,len(data)) as int)  AND cast(substring('ACQPO20',6,len(data)) as int)
于 2013-10-11T05:08:46.520 回答
0

这就是你将如何做到这一点Oracle

SELECT po.No, po.PoS
FROM PoDetails pod
INNER JOIN Pors po ON po.Id=PoD.PoId
WHERE SUBSTR(po.No, 1, 5) = 'ACPQO'
 AND TO_NUMBER(SUBSTR(po.No, 6, 2)) >= 1
 AND TO_NUMBER(SUBSTR(po.No, 6, 2)) <= 20;

FirstSUBSTR()用于匹配值的文本部分。然后使用 和 将值的数字部分解析为数字,并TO_NUMBER()使其可用于数字比较。(其他数据库也有类似的功能来做同样的事情。)120

于 2013-10-11T05:05:46.760 回答
0

只需使用范围 10 到 20 即可!

SELECT po.No,
   po.PoS
FROM PoDetails pod
INNER JOIN Pors po ON po.Id=PoD.PoId
WHERE po.No BETWEEN 'ACQPO10' AND 'ACQPO20'
于 2021-07-14T07:46:46.820 回答
0

对于 MYSQL:-

SELECT * FROM my_table WHERE SUBSTR(seq_num, 1,3) = 'ABC' /* 验证前缀码 */ AND REPLACE(seq_num, 'ABC', '') >= 61440 AND REPLACE(seq_num, 'ABC', '' ) <= 61807

或者

SELECT * FROM my_table WHERE SUBSTR(seq_num, 1,3) = 'ABC' /* 验证前缀码 */ AND substr(seq_num, 4, length(seq_num)) >= 61440 AND SUBSTR(seq_num, 4, LENGTH(seq_num) ) <= 61807

适用于(喜欢):

ABC61447, ABC61448, ABC61545, ..., ..., ABC61807

于 2021-04-29T19:16:26.677 回答