SQL Server 查询使用 BETWEEN 过滤器带来不匹配的数据
Posted
技术标签:
【中文标题】SQL Server 查询使用 BETWEEN 过滤器带来不匹配的数据【英文标题】:SQL Server query brings unmatched data with BETWEEN filter 【发布时间】: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:如果我使用 <=
和 >=
而不是 between
,我会得到相同的结果。
【问题讨论】:
您的排序规则似乎不包括“-”符号 - 这样的结果是有意义的,FE 介于 FD 和 FM 之间。 感谢阿沃!您是对的,更改该列的排序规则(从 Modern_Spanish_CI_AS 到 Latin1_General_CP1_CI_AS)删除了奇数值。你能再写一次作为答案,这样我就可以投票给你了吗?谢谢! @Arvo:应该是一个答案,所以我们可以投票。 @Pablo:使用 @user 通知“用户”... 【参考方案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 起始码之间。 抱歉,误读了。您可以在代码中使用它,就像您说的没问题一样。不要真的认为这是一个大问题。比更改排序规则更好。以上是关于SQL Server 查询使用 BETWEEN 过滤器带来不匹配的数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 SQL Server 复制 Oracle 的 RANGE BETWEEN 窗口子句语法
SQL Server 中的“BETWEEN”函数是不是非常昂贵?