2011-10-19 73 views
-1

我使用SQL Server 2005的SQL Server 2005中查詢具體的結果分組和順序由

請考慮以下查詢:

DECLARE @SearchTerm NVARCHAR(4) 
SELECT @SearchTerm = 'X' 

SELECT ProductCode -- NVARCHAR type 
FROM Product 
WHERE ProductCode LIKE '%' + @SearchTerm + '%' 

我如何可以BY子句指定正確的分組/爲了我的查詢按以下特定條件排序結果?

  1. 首先,爲了通過ProductCode的升序其中的ProductCode與@SearchTerm
  2. 然後命令由ProductCode的升序其餘結果開始。

因此,例如,結果可能看起來像:

ProductCode 
----------- 
XAA 
XMA 
XZA 
AXA 
AXZ 
BAX 
BMX 
BXZ 
etc. 

任何答案如初讚賞。

回答

0

感謝大家的答案,但是我必須把這個包查詢和組我自己提出我的首選解決方案,注意其他答案已使用的語法LIKE @SearchTerm + '%',即放棄第一個'%'給了我一個線索,這讓我想起了一箇舊的Excel技巧:

SELECT ProductCode 
FROM Product 
WHERE ProductCode LIKE '%' + @SearchTerm + '%' 
ORDER BY CASE WHEN LEFT(ProductCode, LEN(@SearchTerm)) = @SearchTerm THEN 0 ELSE 1 END ASC, ProductCode ASC 
2

以下應該做你想做的。首先,我們通過ProductCode ASC命令,如果它以搜索術語開頭(注意:如果ProductCode包含@SearchTerm中的任何位置,則不僅僅以此開頭),您的where子句將進行評估。然後我們通過ProductCode進行訂購。 如果搜索ProductCode不是以@SearchTerm開頭,那麼我們只是按ProductCode進行排序(因爲所有第一個值的順序都是空的)。

DECLARE @SearchTerm NVARCHAR(4) 
SELECT @SearchTerm = 'X' 

SELECT ProductCode 
FROM Product 
WHERE ProductCode LIKE '%' + @SearchTerm + '%' 
ORDER BY 
CASE WHEN ProductCode LIKE @SearchTerm + '%' THEN 0 ELSE 1 END 
,CASE WHEN ProductCode LIKE @SearchTerm + '%' THEN ProductCode ELSE NULL END ASC 
, ProductCode ASC 
+0

抱歉,這是行不通的(即使我註釋掉',Citicode ASC' –

+0

固定,通過條件的第一順序消除了由 – Kyro

0

作爲一個選項,UNION解決方案可以應用在這裏:

SELECT ProductCode 
FROM Product 
WHERE ProductCode LIKE @SearchTerm + '%' 
union 
SELECT ProductCode 
FROM Product 
WHERE ProductCode LIKE '%' + @SearchTerm + '%' 
and ProductCode NOT LIKE @SearchTerm + '%' 

後,我們可以通過與外部查詢

+1

聯盟停止訂單的空值問題只允許由一個條件順序對於整個陳述(即第一個和第二個選擇),所以你仍然必須通過執行套管順序。依靠sql server將讀取數據的默認順序是不明智的。如果你依靠訂單或需要一個,那麼你應該把它放在SQL中。 – Kyro

+0

你是對的,我忘了這個細微差別。提高您的解決方案。 – heximal