2012-03-24 80 views
4

我正在讀取其他人編寫的TSQL代碼,並發現有點奇怪的語法。它正在按字符串排序。我做了一些測試,下面是代碼。任何人都可以幫我解釋一下嗎?謝謝。SQL Server按語法排序時的順序當和常量

首先查詢

SELECT * 
FROM dbo.Products 

結果:

ProductID ProductName      SupplierID CategoryID QuantityPerUnit  UnitPrice    UnitsInStock UnitsOnOrder ReorderLevel Discontinued 
----------- ------------------------------- ----------- ----------- -------------------- --------------------- ------------ ------------ ------------ ------------ 
1   Chai       1   1   10 boxes x 20 bags 18.00     39   0   10   0 
2   Chang       1   1   24 - 12 oz bottles 19.00     17   40   25   0 
3   Aniseed Syrup     1   2   12 - 550 ml bottles 10.00     13   70   25   0 
4   Chef Anton's Cajun Seasoning 2   2   48 - 6 oz jars  22.00     53   0   0   0 
... 

*/ 

第二個查詢:

SELECT * 
FROM dbo.Products 
WHERE ProductID < 10 
ORDER BY '3'; 

結果:

消息408,級別16,狀態1,1 ORDER BY列表時遇到一個常量表達式 線,位置1

第三查詢

SELECT * 
FROM dbo.Products 
WHERE ProductID < 10 
ORDER BY CASE WHEN SupplierID = 2 THEN '1' 
       WHEN SupplierID = 1 THEN '2' 
       ELSE '3' 
     END; 

結果:

ProductID ProductName        SupplierID CategoryID QuantityPerUnit  UnitPrice    UnitsInStock UnitsOnOrder ReorderLevel Discontinued 
----------- ---------------------------------------- ----------- ----------- -------------------- --------------------- ------------ ------------ ------------ ------------ 
4   Chef Anton's Cajun Seasoning    2   2   48 - 6 oz jars  22.00     53   0   0   0 
5   Chef Anton's Gumbo Mix     2   2   36 boxes    21.35     0   0   0   1 
1   Chai          1   1   10 boxes x 20 bags 18.00     39   0   10   0 
2   Chang         1   1   24 - 12 oz bottles 19.00     17   40   25   0 
3   Aniseed Syrup       1   2   12 - 550 ml bottles 10.00     13   70   25   0 
6   Grandma's Boysenberry Spread    3   2   12 - 8 oz jars  25.00     120   0   25   0 
7   Uncle Bob's Organic Dried Pears   3   7   12 - 1 lb pkgs.  30.00     15   0   10   0 
8   Northwoods Cranberry Sauce    3   2   12 - 12 oz jars  40.00     6   0   0   0 
9   Mishi Kobe Niku       4   6   18 - 500 g pkgs.  97.00     29   0   0   1 

(9 row(s) affected) 
*/ 

回答

7

「Order by」必須能夠將每行轉換爲一個值,然後可以比較這些值。 「按'3'排序」作爲有用的查詢沒有任何意義,因爲它不使用行 - 因此是通過常量表達式排序的錯誤消息。

「按(某些表達式返回字符串)排序」非常有意義。我個人會使用數字而不是字符串,但基本上它仍然只是按值排序。

您是否覺得奇怪的看到「按產品名稱排序」?這也是一個字符串排序。

希望這會有所幫助 - 雖然不清楚是哪一位引發了問題。

+0

謝謝,明確的解釋。 – 2012-03-24 10:00:11

3
CASE WHEN SupplierID = 2 THEN '1' 
    WHEN SupplierID = 1 THEN '2' 
    ELSE '3' 
    END 

等於(在僞代碼):

if supplierId = 2 then 
    order_value = 1 
else if supplierId = 1 then 
    order_value = 2 
else 
    order_value = 3 
end 

所以訂單目前已根據ORDER_VALUE

+0

謝謝,清楚的解釋。 – 2012-03-24 09:59:37

4

在你的第一個SQL查詢,原來的編碼器可能意味着

ORDER BY 3 

這意味着「按第3列排序」(即SupplierId),按升序排列。

在第二查詢,如@Kokizzo解釋,作者從硬1 supplierId從其它供應商編碼的查詢,以便從supplierId 2的產品是在頂部,其次是,然後將所有的行。目的不明確,但例如,這可能是一種惡意的嘗試,以促使某個供應商的產品高於其他人的產品,例如,在網頁搜索結果頁面。

CASE WHEN .. ELSE ... END可以等同於施加到每一行,它接受supplierId作爲輸入,並返回ORDER BY子句中使用該行的優先級的簡單函數。

+1

相當可能的解釋IMO。結果確實按照「SupplierID」的升序返回,並且在SQL Server 2000(或2000兼容模式)下,此常數表達式的排序也不會引發語法錯誤。 – 2012-03-25 16:17:57

+0

我認爲這是最可能的情況。從我+1。 – deutschZuid 2012-03-25 22:31:41