2012-03-24 78 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