我正在尝试基于从其CASE/WHEN/ELSE
语句返回值的SELECT
来更新列的值,例如
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
的实际值为'N‘时将H.COLH
设置为'N’。
添加WHEN H.COLH IS NULL
不起作用。我尝试将整个SELECT
包装在另一个SELECT... FROM DUAL
和另一个CASE/WHEN/ELSE
中,但它返回多个值。
有没有一种方法可以将NULL
的值视为'N‘,即使TBLH
中没有记录(更不用说TBLH.COLH
了)?
发布于 2018-08-14 07:58:39
我会这样写:
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
也能更好地捕捉到你想要的逻辑。
发布于 2018-08-14 07:38:13
您可以将子查询包装在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 */
https://stackoverflow.com/questions/51831877
复制相似问题