【问题标题】:SQL Server query brings unmatched data with BETWEEN filterSQL Server 查询使用 BETWEEN 过滤器带来不匹配的数据
【发布时间】:2011-05-13 20:32:33
【问题描述】:

我正在我的产品表中查询所有代码之间的代码的产品,结果带来了一个不应该存在的行。

这是我的 SQL 查询:

select prdcod
from products
where prdcod between 'F-DH1' and 'F-FMS'
order by prdcod

这个查询的结果是:

F-DH1
F-DH2
F-DH3
FET-RAZ       <-- What is this value doing here!?
F-FMC
F-FML
F-FMS

这个奇怪的值如何进入查询结果?

PS:如果我使用 &lt;=&gt;= 而不是 between,我会得到相同的结果。

【问题讨论】:

  • 您的排序规则似乎不包括“-”符号 - 这样的结果是有意义的,FE 介于 FD 和 FM 之间。
  • 感谢阿沃!您是对的,更改该列的排序规则(从 Modern_Spanish_CI_AS 到 Latin1_General_CP1_CI_AS)删除了奇数值。你能再写一次作为答案,这样我就可以投票给你了吗?谢谢!
  • @Arvo:应该是一个答案,所以我们可以投票。 @Pablo:使用 @user 通知“用户”...

标签: sql sql-server-2005 filtering collation


【解决方案1】:

根据 OP 要求,推荐下一条评论来回答:

似乎您的排序规则不包括“-”符号 - 这样的结果是有意义的,FE 介于 FD 和 FM 之间。

:)

【讨论】:

    【解决方案2】:

    between and >= 和

    现在,虽然我认为我理解您的目标,但我并不完全确定是否可以使用 SQL Server 查询。这可能是一些需要在代码中实现的业务逻辑(感谢产品代码)。 Entity Framework 或 Linq-to-SQL 之类的东西可能更适合为您提供所需的数据。

    【讨论】:

      【解决方案3】:

      添加AND LEFT(prdcod, 2) = 'F-'怎么样?

      【讨论】:

      • 不能。这些范围恰好是一种特殊情况:并非所有产品代码都以“F-”开头。范围限制由参数传递。
      【解决方案4】:

      尝试将“-”替换为空格,以使顺序符合您的预期:

      DECLARE @list table(word varchar(50))
      
      --create list
      INSERT INTO @list
      SELECT 'F-DH1'
      UNION ALL
      SELECT 'F-DH2'
      UNION ALL
      SELECT 'F-DH3'
      UNION ALL
      SELECT 'FET-RAZ'
      UNION ALL
      SELECT 'F-FMC'
      UNION ALL
      SELECT 'F-FML'
      UNION ALL
      SELECT 'F-FMS'
      
      --original order
      SELECT * FROM @list order by word
      
      --show how order changes
      SELECT *,replace(word,'-',' ') FROM @list order by replace(word,'-',' ')
      
      --show between condition
      SELECT * FROM @list where replace(word,'-',' ') between 'F DH1' and 'F FMS' 
      

      【讨论】:

      • 要做到这一点,我必须提前知道范围内的所有代码,这是我首先要从查询中得到的。不过,我可以在替换(@rstart,'-','')和替换(@rend,'-','')之间使用“where replace(prdcod,'-','')”......但我'正在寻找解决方案,而不是解决方法。
      • 不,你不会,你只需要替换任何不符合你期望顺序的字符。我认为订购东西时会忽略“-”,但可能还有其他类似的字符。所以基本上 F-D 和 FD 是一样的,也就是说 FET-RAZ 介于 F-D 和 F-F 起始码之间。
      • 抱歉,误读了。您可以在代码中使用它,就像您说的没问题一样。不要真的认为这是一个大问题。比更改排序规则更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多