2012-03-24 20 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 
... 

*/ 

2番目のクエリ:

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 ''による注文は、行を使用していないので便利なクエリとしては意味がありません。したがって、定数式による注文のエラーメッセージです。

「順序(文字列を返す式)」は理にかなっています。私は個人的に文字列ではなく数字を使用していましたが、基本的には依然として値段で注文しています。

"ProductNameによる注文"を見るのが奇妙なことはありますか?それはあまりにも文字列で順序付けされています。

うまくいけば、うまくいけばうまくいけば、どちらのビットが問題を引き起こしているのかは分かりません。

+0

ありがとう、明確な説明。 –

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 

ので、順序は今、あなたの最初のSQLクエリでORDER_VALUE

+0

ありがとう、明確な説明。 –

4

によると、元コーダは

を意味している可能性がありますされます
ORDER BY 3 

「昇順で3列目」(SupplierId)を意味します。

@Kokizzoが説明したように、著者はsupplierId 2の製品が先頭にあり、その後にsupplierIdの製品が続き、次に他のサプライヤのすべての行が続くようにクエリをハードコードしています。その目的ははっきりしていませんが、たとえば、特定のサプライヤの製品を他のサプライヤの製品よりも優先させる悪意のある試みかもしれません。ウェブ検索結果ページに表示されます。

CASE WHEN .. ELSE ... ENDは、supplierIdを入力として受け取り、ORDER BY節で使用されているその行の優先順位を戻す、各行に適用される単純な関数と同じにすることができます。

+1

かなりの可能性のある説明IMO。結果は、「SupplierID」の昇順に戻るようになり、SQL Server 2000(または2000互換モード)では、定数式によるこの順序付けでも構文エラーが発生しません。 –

+0

これは最も可能性の高いシナリオだと思います。私の+1。 – deutschZuid

関連する問題