【问题标题】:How do you select using a range of strings in SQL?如何在 SQL 中使用一系列字符串进行选择?
【发布时间】:2009-02-03 04:15:39
【问题描述】:

我有一张带有车牌号的车辆表,我想从中选择一个介于用户提供的“从”和“到”值之间的子集。

假设表格如下所示:

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 Server 包含所有以“DE”开头的行?

【问题讨论】:

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


    【解决方案1】:

    您必须在末尾添加尽可能多的 'zzzz' 以匹配您的列宽定义。

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

    【讨论】:

    • 或者你可以将它“增加”到 'DF' 并使用
    • @Pax - 没错,我只记得很久以前在 DB2 项目中看到过这个 - 有趣的是,我们不得不使用 EBCDIC 等价于最高字符 :)
    • 幸运的是,DB2/z 现在可以使用 Unicode(尽管我们的许多客户仍然坚持 :-)。而且,虽然我们为 z/Linux 获得了所有花哨的 FOSS 工具,但 z/OS UNIX 系统服务并不能编译一半的东西,因为它仍然是 EBCDIC。
    【解决方案2】:
    where reg_num >= @userValueFrom 
    and left(reg_num,char_length(@userValueTo) <= @userValueTo
    

    但请注意,由于 SARG 中的列上有一个函数,因此这里 where 不使用任何索引。

    【讨论】:

      【解决方案3】:

      如果格式有保证,你可以这样做:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2011-10-06
          • 1970-01-01
          • 2020-04-05
          • 2020-10-26
          • 1970-01-01
          • 1970-01-01
          • 2016-01-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多