如何在SQL中选择使用一系列字符串?

时间:2009-02-03 04:15:40

标签: sql sql-server sql-server-2005

我有一张带有注册号的车辆表,并希望选择一些用户提供的“从”和“到”值之间的子集。

所以我们可以说这个表是这样的:

id       reg_num
1        DD1111
2        DD1112
3        DE2245
4        EE5678
5        EF6547

到目前为止我的SQL看起来像这样:

select *
from vehicles
where reg_num >= 'DD'   -- this value is user supplied
and reg_num <= 'DE'     -- and so is this one

应该(按照我的想法)返回:

1        DD1111
2        DD1112
3        DE2245

但相反,只返回:

1        DD1111
2        DD1112

我认为SQL服务器将'DE2245'视为大于'DE',因此排除了该行。

我的问题:如何让SQL服务器包含所有以'DE'开头的行?

4 个答案:

答案 0 :(得分:8)

您必须在最后添加'zzzz',以匹配您的列宽定义。

 select * from vehicles 
 where reg_num  >= 'DD' and reg_num <= 'DE' + 'ZZZZZZZZZZZZ'

答案 1 :(得分:5)

where reg_num >= @userValueFrom 
and left(reg_num,char_length(@userValueTo) <= @userValueTo

但请注意,由于SARG栏中的功能,这里没有使用任何索引。

答案 2 :(得分:1)

如果格式有保证,您只需执行以下操作:

SELECT *
FROM vehicles 
WHERE LEFT(reg_num, 2) BETWEEN 'DD' AND 'DE'

但同样,这可能不是SARGable - 它总是令我感到困惑,因为肯定可以使用reg_num的索引......

答案 3 :(得分:0)

DE2245不低于DE。为了更清楚,DE2245小于DE 3