【问题标题】:Nested case with multiple sub conditions具有多个子条件的嵌套案例
【发布时间】:2015-10-28 01:11:24
【问题描述】:

我很难理解如何正确嵌套 case 语句。 (MSSQL 服务器 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 |
+------+--+------+--+------+

这些尝试导致了这些失败。 查询1

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 = '缺失' If(a1 == NULL) { StatusMissing += 'A'}

编辑2:

StatusMissing 列不存在! 我想使用如下 SQL 语句创建它。 选择 .... 状态 =

所以基本上我只有 A1,A2,B1(在简单表中)。请不要与第一个表混淆。它只是为了展示它应该是什么样子。

【问题讨论】:

  • 你想达到什么目的?:)
  • 抱歉,我想检查一个字段是否包含 NULL 值。如果是这样,那么 StatusMissing 应该告诉我这一点。就像第一张桌子一样。在那里我手动添加了我的结果应该如何显示。 :)
  • 我建议你在一个新表中建立一个结果矩阵并加入它以获得你的结果。
  • 抱歉,这对我有什么帮助?实际上我有数百行。所以你建议我手动检查状态并将它们输入一个额外的表格?还是我误会了你?
  • 粗略,是的。仅当您有一组有限的列或一组有限的结果时才建议这样做。您将使用结果集的静态版本构建一个表,并将当前表连接到该矩阵。

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


【解决方案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 ='';

这也可以一步完成。

【讨论】:

  • 哦,很抱歉让你们感到困惑。要澄清我的问题,请参阅 EDIT2。 StatusMissing 列不存在。它正在使用 Select... 'StatusMissing' = 创建
  • 我不好,理解错了,我认为你只是根据表格报告,所以需要案例。 +Gordon 的答案正是您想要的。
【解决方案2】:

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

  • 不要说“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

【讨论】:

  • 非常感谢戈登!对于我的测试表,这非常有效。我现在已经学会了如何使用它。所以这个答案是最好的!
【解决方案3】:

您可以使用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;

【讨论】:

  • 抱歉,这不起作用。所有结果都显示为 AllOK,除了缺少 ALL 的地方。 ://
  • 可能是因为我忘记了 else 语句。同时,@Gordon Linoff 的解决方案比我的更优雅。
猜你喜欢
  • 2017-09-09
  • 2012-08-24
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 2013-02-26
相关资源
最近更新 更多