2010-11-22 33 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