编写排序查询

use*_*260 1 sql t-sql sql-server

我有一张桌子如下:

Job    Quantity Status
-----------------------
1      100      OK
2      400      HOLD
3      200      HOLD
4      450      OK
5      300     
6      500      
Run Code Online (Sandbox Code Playgroud)

我希望我的结果显示如下:

Job  Quantity Status
----------------------
4      450      OK
2      400      HOLD
1      100      OK
3      200      HOLD
6      500 
5      300
Run Code Online (Sandbox Code Playgroud)

我创建了这个查询,但是当表包含status列为null/empty的数据时它不起作用

SELECT 
    Job, 
    Quantity, 
    Status 
FROM 
    myTable
ORDER BY CASE 
    WHEN QUANTITY >= 400 AND STATUS = 'OK' THEN 1 
    WHEN QUANTITY >= 400 AND STATUS = 'HOLD' THEN 2 
    WHEN QUANTITY <  400 AND STATUS = 'OK' THEN 3 
    WHEN QUANTITY >= 400 AND STATUS = 'HOLD' THEN 4 
    WHEN QUANTITY >= 400 AND STATUS = '' THEN 5 
    WHEN QUANTITY <  400 AND STATUS = '' THEN 6 
END
Run Code Online (Sandbox Code Playgroud)

aca*_*tle 6

除非我误读,否则我觉得你已经回答了自己的问题.您需要考虑数据的时间NULL.

重要的部分是NULL与...不同的类型''.就像'' = 0是假的一样NULL = ''.NULL用于表示空值.根据布尔值而不是字符串来考虑它.显然有时某些东西既不是真的也不是假的,这就是类似的值NULL会出现的地方.同样,如果你认为字符串是纯数据而不是字符和单词,那么空值和没有值之间存在差异.所有.

有关更多信息,请参阅http://www.w3schools.com/sql/sql_null_values.asp

所以我认为你的代码应该是这样的:

SELECT Job, Quantity, Status 
    FROM myTable
ORDER BY CASE 
    WHEN QUANTITY >= 400 AND STATUS = 'OK' THEN 1 
    WHEN QUANTITY >= 400 AND STATUS = 'HOLD'  THEN 2 
    WHEN QUANTITY < 400 AND STATUS = 'OK'  THEN 3 
    WHEN QUANTITY >= 400 AND STATUS = 'HOLD'  THEN 4 
    WHEN QUANTITY >= 400 AND (STATUS = '' OR STATUS IS NULL)  THEN 5 
    WHEN QUANTITY < 400 AND (STATUS = '' OR STATUS IS NULL)  THEN 6
END
Run Code Online (Sandbox Code Playgroud)

除非您明确地将STATUS设置为'',否则您可能只能使用STATUS IS NULL.