如何在CASE WHEN SQL语句中处理不存在的记录?

时间:2018-08-13 23:34:41

标签: sql oracle11g null sql-update case

我正在尝试根据SELECT从其CASE/WHEN/ELSE语句返回值的UPDATE TBL T SET T.COL1 = ( SELECT CASE WHEN H.COLH = 'XY' THEN 'Y' ELSE 'N' END FROM HTBL H WHERE T.ID = H.ID AND /* Other conditions */ ) WHERE T.RN = 100 AND /* Other conditions */ 更新列的值,例如

HTBL

问题是,如果T.COL表中不存在该记录,则不会为T.COL分配任何值,因此NULL仍为T.COL。在这种情况下,我只想在H.COLH的实际值为'N'时将WHEN H.COLH IS NULL设置为'N'。

添加SELECT不起作用。我试图将整个SELECT... FROM DUAL用另一个CASE/WHEN/ELSE包装在另一个NULL中,但是它返回多个值。

即使TBLH中没有记录(更不用说TBLH.COLH)了,有没有办法将include (${CMAKE_ROOT}/Modules/FindJPEG.cmake)的值视为'N'?

2 个答案:

答案 0 :(得分:1)

您可以将子查询包装在COALESCE中:

UPDATE TBL T
SET T.COL1 = COALESCE( (
  SELECT
    CASE
      WHEN H.COLH = 'XY' THEN 'Y'
      ELSE 'N'
    END
  FROM HTBL H
  WHERE T.ID = H.ID
    AND /* Other conditions */
), 'N')
WHERE T.RN = 100
  AND /* Other conditions */

答案 1 :(得分:1)

我会这样写:

UPDATE TBL T
    SET T.COL1 = (CASE WHEN EXISTS (SELECT 1
                                    FROM HTBL H
                                    WHERE T.ID = H.ID AND
                                          /* Other conditions */ AND
                                          H.COLH = 'XY'
                                   )
                       THEN 'Y' ELSE 'N'
                  END)
WHERE T.RN = 100 AND
      /* Other conditions */

我认为EXISTS也可以更好地捕捉您想要的逻辑。