例如:
700表示700.00 - 700.99
400.1表示400.10 - 400.19
目前我有这样的事情:
Select codes
From code_table
where codes in ('700', '400.1')
这不起作用,因为它只是寻找700和400.1,所以我尝试了:
Select codes
From code_table
where left (codes, 3) = '700'
哪个有效,但问题是我正在寻找的初始数字集不仅仅是这里的2,还有一种更简单的方法可以做到这一点,而不必为每一个做这个吗?我认为between子句也可以工作,但每个都需要代码吗?
答案 0 :(得分:1)
如果我已正确理解您的注释,则需要在与varchar()值进行比较时显式构建正则表达式,或者使用带有BETWEEN运算符的字符串。
所以,这个。 。
select *
from code_table
where codes = '700'
or codes like '700.[1-9]'
or codes like '700.[1-9][0-9]';
或者这个。
select *
from code_table
where codes between '700' and '700.99'
第二个更简单。这两个查询都会排除值'700.999',我相信要排除。
使用数字而不是varchar()值,强制转换为十进制。 (不浮动。)
select *
from code_table
where cast(codes as decimal(10, 3)) between 700 and 700.99;
无论如何,您的SQL必须知道代码的结构。如果我在你的位置,我只是明确地通过了范围。这样,完整的责任在于前端代码,所以不应该有任何意外。
答案 1 :(得分:0)
您可以转换为数字并根据您的范围进行测试,例如
Select codes
From code_table
where cast (codes as float) >= 700 and
cast (codes as float) < 700.1
答案 2 :(得分:0)
FLOOR()
SELECT codes FROM code_table WHERE FLOOR(codes) IN (..., ..., ...)
但是你需要小数。那简单地说:
SELECT codes FROM code_table WHERE codes LIKE '700.%' OR codes LIKE '400.1%'
这是标准SQL。对于更智能的解决方案,我要选择(... AS float)
,但代码往往会随着时间的推移而变得更加复杂,例如700.1.10
或700.19b
。所以我可能会创建一个存储过程。
答案 3 :(得分:0)
因为你实际上正在使用文本和文本前缀(不幸的是,它看起来像数字并且导致混淆)
SELECT代码FROM code_table WHERE代码LIKE'700'+'%'
SELECT代码FROM code_table WHERE代码LIKE'400.1'+'%'
答案 4 :(得分:0)
您可以尝试以下内容:
select *
from code_table
where codes like '700.__' or codes like '400.1_'
或者确保只采用数值:
select *
from code_table
where (codes like '700.__' or codes like '400.1_') and isnumeric(codes) = 1