Порядок SQL Server по синтаксису с регистром времени и константой - PullRequest
4 голосов
/ 24 марта 2012

Я читаю код TSQL, который кто-то написал, и нахожу несколько странный синтаксис. Это делает заказ строкой. Я сделал некоторый тест, и следующий код. Кто-нибудь может помочь мне объяснить это? Спасибо.

Первый запрос

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)
*/

Ответы [ 3 ]

7 голосов
/ 24 марта 2012

«Порядок по» должен иметь возможность переводить каждую строку в значение, тогда эти значения можно сравнивать.«Order by '3'» не имеет никакого смысла как полезный запрос, так как он не использует строку - отсюда и сообщение об ошибке упорядочения по константному выражению.

"Order by (некоторое выражение, возвращающеестрока) "имеет смысл.Лично я бы использовал числа, а не строки, но, по сути, все равно это просто упорядочение по значению.

Было бы вам странно видеть "order by ProductName"?Это тоже порядок по строке.

Надеюсь, это поможет, хотя не совсем понятно, какой бит вызывал проблему.

5 голосов
/ 24 марта 2012

В вашем первом запросе SQL исходный кодер мог означать

ORDER BY 3

, что означает «порядок по 3-му столбцу» (то есть SupplierId) в порядке возрастания.

Во втором запросе, как объяснил @Kokizzo, автор жестко закодировал запрос так, чтобы в верхней части находились товары из supplierId 2, за ними следуют товары из supplierId 1, а затем все строки от других поставщиков.Цель не ясна, но, например, это может быть гнусной попыткой продвинуть товары одного поставщика над другими, например, на странице результатов веб-поиска.

CASE WHEN .. ELSE ... END можно приравнять к простой функцииприменяется к каждой строке, которая принимает supplierId в качестве входных данных и возвращает приоритет этой строки, использованной в предложении ORDER BY.

3 голосов
/ 24 марта 2012
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

...