if 语句 - Case when 语句 SQL

if statement - Case when statement SQL

我正在尝试包含一个语句,如果 MISTI returns DOWN 那么我希望它排除 MISTIMISTI-AMISTI-B 来自输出列表。这可能吗?我是 SQL 的新手,非常感谢任何帮助!

示例: AS480 返回为 DOWN 因此我不希望它返回 AS480、AS480-A、AS480-B。

Table 输出:

Select CASE WHEN entity like 'AS480%' then 'A'
WHEN entity like 'ET621%' then 'A'
WHEN entity like 'SZ101%' then 'A'
WHEN entity like 'HD801%' then 'A'
WHEN entity like 'ET328%' then 'A' 
  ELSE 'NONE'
       end as GRID, 
entity as MISTI , cur_state as STATE, ROUND(((SYSDATE-cur_state_dttm)*24),2) AS HRS
      FROM trk_id_def


WHERE cur_state IN ('NM', 'DOWN')
and (entity like 'AS480%'
or entity like 'ET212%'
or entity like 'ET213%'
or entity like 'ET216%'
or entity like 'ET218%'
or entity like 'ET221%'
or entity like 'ET225%'
or entity like 'ET208%'
)
AND ROUND(((SYSDATE-cur_state_dttm)*24),2) >= 0
order by GRID ASC

假设:

  • 父实体始终为 5 个字符
  • 您只想排除子实体 A 和 B(而不是其他实体)

您可以按照以下方式使用:

SELECT CASE
         WHEN entity LIKE 'AS480%' THEN 'A'
         WHEN entity LIKE 'ET621%' THEN 'A'
         WHEN entity LIKE 'SZ101%' THEN 'A'
         WHEN entity LIKE 'HD801%' THEN 'A'
         WHEN entity LIKE 'ET328%' THEN 'A'
         ELSE 'NONE'
       END AS GRID,
       entity AS MISTI,
       cur_state AS STATE,
       ROUND(((SYSDATE - cur_state_dttm)*24),2) AS HRS
FROM trk_id_def x
WHERE cur_state IN ('NM','DOWN')
AND   (entity LIKE 'AS480%' 
    OR entity LIKE 'ET212%' 
    OR entity LIKE 'ET213%' 
    OR entity LIKE 'ET216%' 
    OR entity LIKE 'ET218%' 
    OR entity LIKE 'ET221%' 
    OR entity LIKE 'ET225%' 
    OR entity LIKE 'ET208%')
AND   ROUND(((SYSDATE - cur_state_dttm)*24),2) >= 0
AND   NOT EXISTS (
                  SELECT 1 FROM trk_id_def y 
                  WHERE LENGTH(y.entity) = 5 --presumably (AS480, ETXXX etc)
                    AND y.cur_state = 'DOWN' --the parent entity is down
                    AND SUBSTR(x.entity,1,5) = y.entity --other entities related to the parent
                    AND (SUBSTR(x.entity,6,2) IN ('-A','-B') --just these suffixes
                          OR x.entity = y.entity) --or the parent itself
                          );

如果您可能有子实体名称的其他后缀(-C、-D 等),并且您也想排除这些后缀,则可以删除 AND (RIGHT... 部分。