2010-11-22 52 views
2

我在我的产品表上查询代码范围在代码范围内的所有产品,并且结果带来了不应存在的行。SQL Server查询通过BETWEEN过滤器带来无与伦比的数据

这是我的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 

这个奇怪的价值怎样才能使它的方式进入查询结果?注:如果我使用<=>=而不是between,我会得到相同的结果。

+5

好像你整理排除 ' - ' 符号 - 这样的结果是有意义的,FE是FD和FM之间。 – Arvo 2010-11-22 13:56:37

+1

谢谢阿沃!您是对的,并且更改该列的排序规则(从Modern_Spanish_CI_AS到Latin1_General_CP1_CI_AS)将删除奇数值。你可以再次写这个答案,以便我可以让你喜欢吗?谢谢! – 2010-11-22 14:30:08

+0

@Arvo:应该是一个答案,所以我们可以upvote它。 @Pablo:使用@user将通知“用户”... – gbn 2010-11-22 17:44:21

回答

4

据晋升下一评论回答OP的要求:

好像你整理排除' - '符号 - 这样做的结果是有道理的,FE位于FD和FM之间。

:)

0

and> =和< =主要用于数字操作(包括日期)。你正在尝试使用这个字符串,这很难确定这些操作符将如何解释每个字符串。

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

0

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

+0

不能这样做。这些范围恰好是特定情况:并非所有产品代码都以'F-'开头。范围限制通过参数传递。 – 2010-11-22 14:46:58

0

尝试更换“ - ”有空间,因此顺序是你所期望的:

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' 
+0

要做到这一点,我必须事先知道范围内的所有代码,这正是我试图从查询中得到的东西。尽管如此,我可以使用替换(@rstart,' - ','')和替换(@rend,' - ','')“之间的替换(prdcod,' - ','')”......但是我正在寻找解决方案,而不是解决方法。 – 2010-11-22 15:00:21

+0

不,你不会,你只需要替换任何字符,不会给你所期望的顺序。我认为“ - ”在订购商品时被忽略,但也可能有其他字符。所以基本上F-D与FD相同,这意味着FET-RAZ在F-D和F-F起始码之间。 – Michael 2010-11-22 16:40:58

+0

对不起,误读。你可以在代码中使用它,就像你说的没问题。不要把这看作是一个大问题。比改变整理更好。 – Michael 2010-11-22 16:48:44