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:如果我使用 &lt;=&gt;= 而不是 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 BETWEEN and

使用 SQL Server 复制 Oracle 的 RANGE BETWEEN 窗口子句语法

SQL 日期格式 BETWEEN 查询

SQL Server 中的“BETWEEN”函数是不是非常昂贵?

Datetime BETWEEN 语句在 SQL Server 中不起作用

sql 语句问题,关于BETWEEN AND 和DATE 的