Sql 编写排序查询

Sql 编写排序查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的表格如下: Job Quantity Status ----------------------- 1 100 OK 2 400 HOLD 3 200 HOLD 4 450 OK 5 300 6 500 Job Quantity Status ---------------------- 4 450 OK 2 400 HO

我的表格如下:

Job    Quantity Status
-----------------------
1      100      OK
2      400      HOLD
3      200      HOLD
4      450      OK
5      300     
6      500      
Job  Quantity Status
----------------------
4      450      OK
2      400      HOLD
1      100      OK
3      200      HOLD
6      500 
5      300
我希望我的结果如下所示:

Job    Quantity Status
-----------------------
1      100      OK
2      400      HOLD
3      200      HOLD
4      450      OK
5      300     
6      500      
Job  Quantity Status
----------------------
4      450      OK
2      400      HOLD
1      100      OK
3      200      HOLD
6      500 
5      300
我已经创建了这个查询,但是当表包含
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
选择
工作,
量
地位
从…起
我的桌子
逐案订购
当数量>=400且状态为“正常”时,则为1
当数量>=400且状态为“保持”时,则为2
当数量小于400且状态为“正常”时,则为3
当数量>=400且状态为“保持”时,则为4
当数量>=400且状态为“”时,则为5
当数量<400且状态=''时,则为6
结束

除非我误读了,否则我觉得你已经回答了你自己的问题。当数据为
NULL
时,您需要说明原因

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

有关详细信息,请参阅

因此,我认为您的代码应该如下所示:

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
选择作业、数量、状态
从myTable
逐案订购
当数量>=400且状态为“正常”时,则为1
当数量>=400且状态为“保持”时,则为2
当数量小于400且状态为“正常”时,则为3
当数量>=400且状态为“保持”时,则为4
当数量>=400且(状态=''或状态为空)时,则为5
当数量<400且(状态=''或状态为空)时,则为6
结束

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

,除非我误读了,我觉得您已经回答了自己的问题。当数据为
NULL
时,您需要说明原因

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

有关详细信息,请参阅

因此,我认为您的代码应该如下所示:

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
选择作业、数量、状态
从myTable
逐案订购
当数量>=400且状态为“正常”时,则为1
当数量>=400且状态为“保持”时,则为2
当数量小于400且状态为“正常”时,则为3
当数量>=400且状态为“保持”时,则为4
当数量>=400且(状态=''或状态为空)时,则为5
当数量<400且(状态=''或状态为空)时,则为6
结束

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

尝试使用以下查询:-

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 COALESCE(STATUS,'') = '' THEN 5  
    WHEN QUANTITY <  400 AND COALESCE(STATUS,'') = '' THEN 6  
END 
选择
工作,
量
地位
从…起
我的桌子
逐案订购
当数量>=400且状态为“正常”时,则为1
当数量>=400且状态为“保持”时,则为2
当数量小于400且状态为“正常”时,则为3
当数量>=400且状态为“保持”时,则为4
当数量>=400且合并(状态“”)=''时,则为5
当数量<400且合并(状态,'')=''时,则为6
结束
COALESCE()
函数返回第一个非空参数,因此如果
STATUS
null
它将返回
'


尝试使用以下查询:-

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 COALESCE(STATUS,'') = '' THEN 5  
    WHEN QUANTITY <  400 AND COALESCE(STATUS,'') = '' THEN 6  
END 
选择
工作,
量
地位
从…起
我的桌子
逐案订购
当数量>=400且状态为“正常”时,则为1
当数量>=400且状态为“保持”时,则为2
当数量小于400且状态为“正常”时,则为3
当数量>=400且状态为“保持”时,则为4
当数量>=400且合并(状态“”)=''时,则为5
当数量<400且合并(状态,'')=''时,则为6
结束
COALESCE()
函数返回第一个非空参数,因此如果
STATUS
null
它将返回
'


检查IS NULL而不是“”,看它是否有区别。检查IS NULL而不是“”,看它是否有区别。在这篇文章的早期版本中,我错误地说DBs中使用NULL值的原因是为了节省内存。我注意到这是不正确的,我更新了我的答案以反映这一点。在这篇文章的早期版本中,我错误地说DBs中使用空值的原因是为了节省内存。我注意到这是不正确的,我更新了我的答案以反映这一点。+1因为我在这篇文章之前从未听说过COALESCE。+1因为我在这篇文章之前从未听说过COALESCE。