2016-09-19 63 views
0

我正在編寫一個T-SQL查詢,我試圖讓查詢的結果與它們的確切順序相同在where語句中請求。下面是我想要實現的一個例子。 感謝如何讓我的tsql查詢結果設置爲與where語句相同的順序

Select LoanNumber 
From Table 
Where LoanNumber in ('123456789', '987654321', '741852963') 

預期的效果:在結果我想以同樣的順序那些同樣loannumbers以它們輸入。我所得到的是有時它將結果以各種順序排列。我已經嘗試了order by子句,但它仍然沒有產生預期的效果。

+0

如果它只是那些三個數字,你可以嘗試通過一個case語句添加列。像'Case'這樣的'123 ..',然後是1'987 ...',然後是2 ...作爲順序。然後做一個外部選擇語句,並按該新列進行排序。 – wbrugato

+0

按您希望排序的順序將您的值插入臨時表或@table變量。在臨時表變量上有一個標識列。內部連接到這個臨時表,並按照標識列排序 –

回答

1

由於order by條款是爲了保證結果集順序的唯一方法,你可以用構建您的where條款相匹配的order by條款,像這樣走:

select * 
from LoanTable 
where LoanNumber in ('123456789', '987654321', '741852963') 
order by case LoanNumber 
when '123456789' then 1 
when '987654321' then 2 
when '741852963' then 3 
... 
else 9999 end 

如果你正在構建動態的where ,但這不會太壞,因爲order by的邏輯在每一步都會匹配。

+1

Linoff重複提供的更好的答案 – Paparazzi

+0

這個答案是不同的,有趣的(用'VALUES'子句和元組構造順序),但我不一定會說更好,至少不是內在的(我可以看到)。在任何一種情況下,它都必須動態生成,所以我不認爲可讀性會非常重要......但對每個人來說都是如此重要。 – SlimsGhost

+0

@SlimsGhost Gordon回答了其他問題,其答案類似於您的答案。你的回答是一個很好的答案。 – scsimon

0

有沒有本地SQL方式來說ORDER BY「在WHERE子句中出現的順序」。

你可以做這樣的事情是什麼SlimsGhost證明或者你可以使用一個臨時表是這樣的:

-- your table 
DECLARE @Table TABLE(LoanNumber bigint); 
INSERT @Table VALUES ('987654321'),('741852963'),('123456789'),('1234'),('123456789'); 

-- a "filter table" 
DECLARE @tmp TABLE (ordinal tinyint identity, LoanNumber bigint); 
INSERT @tmp (LoanNumber) VALUES ('123456789'),('987654321'),('741852963'); 

-- Using the filter table 
SELECT LoanNumber 
FROM 
(
    SELECT ordinal, t.LoanNumber 
    FROM @Table t 
    JOIN @tmp x ON t.LoanNumber = x.LoanNumber 
    GROUP BY ordinal, t.LoanNumber 
) ln 
ORDER BY ordinal; 
相關問題