更新多列时,防止在 select 没有返回行的情况下更新 null

When updating multiple columns, prevent updating null in case of no row is returned from select

我正在开发 db2 z/os 10.

当我更新单个列时,我可以这样编写查询(以防止 A.COL1 列中出现空值)。


UPDATE TABLE1 A
SET A.COL1 = COALESCE((
            SELECT B.COL1
            FROM TABLE2 B
            WHERE A.KEY = B.KEY
            ), '');

但是,如果要更新多个列,因为我不能使用 COALESCE,我必须使用 "Exists" 子句(如下所示)。


UPDATE TABLE1 A
SET (
        A.COL1
        ,A.COL2
        ) = (
        SELECT B.COL1
            ,B.COL2
        FROM TABLE2 B
        WHERE A.KEY = B.KEY
        )
WHERE EXISTS (
        SELECT 'X'
        FROM TABLE2 B
        WHERE A.KEY = B.KEY
        );

我能否仅使用标量函数(不使用 EXISTS)重写第二个查询并防止更新 COL1 和 COL2 中的 null。

不确定:

UPDATE TABLE1 A
SET (A.COL1, A.COL2) = 
COALESCE(
    (SELECT 
        B.COL1,'',
        B.COL2,''
    FROM TABLE2 B
    WHERE A.KEY = B.KEY),
    ('','')
);

也许您正在寻找这样的东西:

UPDATE A
SET  A.COL1 = COALESCE(B.COL1,'')
    ,A.COL2 = COALESCE(B.COL2,'')
FROM table1 A
JOIN TABLE2 B ON A.[KEY] = B.[KEY]

认为以下会起作用(我手头没有 DB2 来测试它):

UPDATE TABLE1 A
    SET (A.COL1, A.COL2) =
        (SELECT COALESCE(MAX(B.COL1), A.COL1),
                COALESCE(MAX(B.COL2), A.COL2)
         FROM TABLE2 B
         WHERE A.KEY = B.KEY
        );

MAX() 保证只返回一行——即使没有匹配项。其余的只是选择使用哪个值。请注意,这将保留当前值,即使匹配值为 NULL(即存在匹配但行中的值为 NULL)。

此外,WHERE 子句中的 EXISTS 通常是一个 好的 想法,因为它减少了需要访问的行数更新。