具有多个子条件的嵌套案例

时间:2015-08-05 10:10:38

标签: sql sql-server case case-statement multiple-conditions

我无法理解如何正确嵌套case语句。 (MSSQL Server 2012)

我们给出下表。 列StatusMissing是我想要创建的

+------+--+------+--+------+--+------+--+------+--+------+--+---------------+
|  a1  |  |  a2  |  |  a3  |  |  b1  |  |  c1  |  |  d2  |  | StatusMissing |
+------+--+------+--+------+--+------+--+------+--+------+--+---------------+
| OK   |  | OK   |  | OK   |  | OK   |  | OK   |  | OK   |  | AllOK         |
| NULL |  | NULL |  | OK   |  | OK   |  | OK   |  | OK   |  | As            |
| OK   |  | NULL |  | OK   |  | OK   |  | OK   |  | OK   |  | As            |
| OK   |  | OK   |  | NULL |  | OK   |  | OK   |  | OK   |  | As            |
| OK   |  | OK   |  | OK   |  | NULL |  | OK   |  | OK   |  | B             |
| OK   |  | OK   |  | OK   |  | OK   |  | NULL |  | OK   |  | C             |
| OK   |  | OK   |  | OK   |  | OK   |  | OK   |  | NULL |  | D             |
| NULL |  | OK   |  | OK   |  | NULL |  | NULL |  | OK   |  | ABC           |
| NULL |  | OK   |  | OK   |  | OK   |  | NULL |  | NULL |  | ACD           |
| NULL |  | OK   |  | OK   |  | NULL |  | OK   |  | NULL |  | ABD           |
| NULL |  | OK   |  | OK   |  | NULL |  | NULL |  | NULL |  | ABCD          |
| NULL |  | OK   |  | OK   |  | OK   |  | NULL |  | NULL |  | ACD           |
| OK   |  | OK   |  | OK   |  | NULL |  | NULL |  | OK   |  | BC            |
| OK   |  | OK   |  | OK   |  | OK   |  | OK   |  | OK   |  | AllOK         |
| OK   |  | NULL |  | OK   |  | OK   |  | NULL |  | OK   |  | AC            |
| OK   |  | OK   |  | OK   |  | NULL |  | OK   |  | NULL |  | BD            |
| OK   |  | OK   |  | OK   |  | OK   |  | NULL |  | NULL |  | CD            |
+------+--+------+--+------+--+------+--+------+--+------+--+---------------+

首先,为了理解嵌套的概念,我简化了表格:

+------+--+------+--+------+
|  a1  |  |  a2  |  |  b1  |
+------+--+------+--+------+
| OK   |  | OK   |  | OK   |
| OK   |  | OK   |  | NULL |
| OK   |  | NULL |  | OK   |
| NULL |  | OK   |  | OK   |
| NULL |  | NULL |  | OK   |
| NULL |  | OK   |  | NULL |
| OK   |  | NULL |  | NULL |
+------+--+------+--+------+

这些尝试导致了这些失败。 QUERY1

SELECT a1, a2, b1 'StatusMissing' =
CASE 
        WHEN a1 IS NULL
        THEN 
                CASE
                        WHEN a1 IS NULL
                        THEN 
                                CASE
                                        WHEN b1 IS NULL
                                        THEN 'AB'
                                END
                        ELSE 'A'
                END

        WHEN b1 IS NULL
        THEN 'B'
        ELSE 'AllOK'
END
FROM Table;

结果1:

+------+--+------+--+------+--+---------------+
|  a1  |  |  a2  |  |  b1  |  | StatusMissing |
+------+--+------+--+------+--+---------------+
| OK   |  | OK   |  | OK   |  | AllOK         |
| OK   |  | OK   |  | NULL |  | B             |
| OK   |  | NULL |  | OK   |  | AllOK         |
| NULL |  | OK   |  | OK   |  | NULL          |
| NULL |  | NULL |  | OK   |  | NULL          |
| NULL |  | OK   |  | NULL |  | AB            |
| OK   |  | NULL |  | NULL |  | B             |
+------+--+------+--+------+--+---------------+

Query2(另作主要)

SELECT a1, a2, b1, 'Status' =
CASE 
        WHEN a1 IS NOT NULL AND a2 IS NOT NULL AND b1 IS NOT NULL
        THEN 'AllOK!'
        ELSE
                CASE
                        WHEN a2 IS NOT NULL OR a2 IS NOT NULL
                        THEN 
                                CASE
                                        WHEN b1 IS NULL
                                        THEN 'AB'
                                END

                        WHEN b1 IS NULL
                        THEN 'B'

                        ELSE 'A'
                END
END
FROM Table;

结果2

+------+--+------+--+------+--+---------------+
|  a1  |  |  a2  |  |  b1  |  | StatusMissing |
+------+--+------+--+------+--+---------------+
| OK   |  | OK   |  | OK   |  | AllOK         |
| OK   |  | OK   |  | NULL |  | AB            |
| OK   |  | NULL |  | OK   |  | A             |
| NULL |  | OK   |  | OK   |  | NULL          |
| NULL |  | NULL |  | OK   |  | A             |
| NULL |  | OK   |  | NULL |  | AB            |
| OK   |  | NULL |  | NULL |  | B             |
+------+--+------+--+------+--+---------------+

我到底做错了什么? 我对SQL很新,所以如果有一个合适的功能来做这个我会很感激! 编辑: 如果在SQL中这样的事情是可能的,我的意思是: 列StatusMissing ='missing' 如果(a1 == NULL){StatusMissing + ='A'}

EDIT2:

列StatusMissing不在那里! 我想使用如下的SQL语句创建它。 SELECT ....状态=

所以基本上我只有A1,A2,B1(在简单表中)。请不要对第一张表感到困惑。它只是显示它应该是什么样的。

3 个答案:

答案 0 :(得分:1)

对于简化表,假设数据类型为nvarchar

尝试使用UPDATE -

  UPDATE [dbo].[StatusMissing]
  SET result='';

  UPDATE [dbo].[StatusMissing]
  SET result= CONCAT(result , 'A')
  WHERE a1 is null or a2 is null;


  UPDATE [dbo].[StatusMissing]
  SET result= CONCAT(result , 'B')
  WHERE b1 is null ;

  UPDATE [dbo].[StatusMissing]
  SET result= 'AllOK'
  WHERE result ='';

这也可以一步完成。

答案 1 :(得分:0)

您可以使用COALESCE和几个CASE条件

SELECT a1,
  a2,
  a3,
  b1,
  c1,
  d2,
  COALESCE(
    CASE WHEN 
      b1 = 'OK' 
      AND c1 = 'OK' 
      AND d2 = 'OK' 
      AND (a1 IS NULL OR a2 IS NULL OR a3 is NULL) 
    THEN 'As' 
    ELSE ''
    END,
    CASE WHEN 
      (a1 IS NULL OR a2 IS NULL or a3 is NULL) 
    THEN 'A' 
    END  
    + CASE WHEN 
        b1 IS NULL 
      THEN 'B'
      ELSE '' 
      END
    + CASE WHEN 
        c1 IS NULL 
      THEN 'C'
      ELSE '' 
      END 
    + CASE WHEN 
        d2 IS NULL 
      THEN 'D' 
      ELSE ''
    END,
    'AllOK') AS 'StatusMissing'
FROM Table;

答案 2 :(得分:0)

我可能会建议您对输出进行两处小修改:

  • 而不是“As”,只说“A”。
  • 不要使用“AllOK”,只需将该字段留空即可。

通过这些修改,规则非常简单:

select t.*,
       ((case when a1 is null or a2 is null or a3 is null then 'A' else '' end) +
        (case when b1 is null then 'B' else '' end) +
        (case when c1 is null then 'C' else '' end) +
        (case when d1 is null then 'D' else '' end)
       ) as StatusMissing
from table t;

如果你想要你的版本,子查询可能是最简单的方法:

select t. . . .,
       (case when StatusMissing = '' then 'AllOK'
             when StatusMissing = 'A' then 'As'
             else StatusMissing
        end) as StatusMissing
from (select t.*,
             ((case when a1 is null or a2 is null or a3 is null then 'A' else '' end) +
              (case when b1 is null then 'B' else '' end) +
              (case when c1 is null then 'C' else '' end) +
              (case when d1 is null then 'D' else '' end)
             ) as StatusMissing
      from table t
     ) t