为什么sql case不能处理int列的null条件

时间:2015-09-29 05:54:35

标签: sql sql-server sql-server-2008

我在表的INT类型列上使用了SQL CASE语句。 以下是SQL表架构和查询,它正常工作。

SQL查询

CREATE TABLE #TEMP_A(ID BIGINT ,ACCEPTED INT)
INSERT INTO #TEMP_A VALUES(1,1)
INSERT INTO #TEMP_A(ID) VALUES(2)
INSERT INTO #TEMP_A(ID) VALUES(3)
INSERT INTO #TEMP_A(ID) VALUES(4)
INSERT INTO #TEMP_A VALUES(5,1)

SELECT T.ID,T.ACCEPTED,
(CASE WHEN(T.ACCEPTED=1) THEN 'ACCEPTED' ELSE 'NOT ACCEPTED' END) AS STATUS
FROM #TEMP_A T

查询输出

ID  ACCEPTED    STATUS
1   1           ACCEPTED
2   NULL        NOT ACCEPTED
3   NULL        NOT ACCEPTED
4   NULL        NOT ACCEPTED
5   1           ACCEPTED

但现在问题在于我有一个条件,我需要在select语句中打印不接受所以我尝试了以下查询

SQL查询

SELECT T.ID,T.ACCEPTED,
(CASE WHEN(T.ACCEPTED=NULL) THEN 'NOT ACCEPTED' END) AS STATUS
FROM #TEMP_A T

查询实际输出

ID  ACCEPTED    STATUS
1   1           NULL
2   NULL        NULL
3   NULL        NULL
4   NULL        NULL
5   1           NULL

查询所需的输出

ID  ACCEPTED    STATUS
1   1           NULL
2   NULL        NOT ACCEPTED
3   NULL        NOT ACCEPTED
4   NULL        NOT ACCEPTED
5   1           NULL

我必须打印select语句中不接受的状态 我该怎么做才能得到所需的结果。

5 个答案:

答案 0 :(得分:3)

使用IS NULL检查NULL值。试试这个问题:

SELECT T.ID,T.ACCEPTED,
(CASE WHEN (T.ACCEPTED IS NULL) THEN 'NOT ACCEPTED' END) AS STATUS
FROM #TEMP_A T

答案 1 :(得分:2)

尝试使用NULL来检查它是否为SELECT T.ID,T.ACCEPTED, (CASE WHEN(T.ACCEPTED IS NULL) THEN 'NOT ACCEPTED' END) AS STATUS FROM #TEMP_A T

twitter-button

答案 2 :(得分:2)

尝试:

SELECT T.ID,T.ACCEPTED,
(CASE WHEN T.ACCEPTED IS NULL THEN 'NOT ACCEPTED' END) AS STATUS
FROM #TEMP_A T

答案 3 :(得分:0)

为了区别..

SELECT 
   T.ID
   , T.ACCEPTED,
   , ISNULL(
       CASE 
          WHEN T.ACCEPTED = 1 
             THEN 'ACCEPTED' ELSE NULL
          END
     , 'NOT ACCEPTED') AS STATUS
FROM #TEMP_A T

答案 4 :(得分:0)

或者做这样的事情:),因为你使用的是SQL Server,为什么不使用SQL的ISNULL内置函数。

    SELECT T.ID,T.ACCEPTED,
    (CASE WHEN(ISNULL(T.ACCEPTED,'') = '') THEN 'NOT ACCEPTED' END) AS STATUS
    FROM #TEMP_A T