更新多列时,防止在 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
通常是一个 好的 想法,因为它减少了需要访问的行数更新。
我正在开发 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
通常是一个 好的 想法,因为它减少了需要访问的行数更新。