我正在更新 Oracle 中的临时表。我的想法是我可以使用 NVL 来设置一个值(基本上使两边的空值相等)
更新中发生的情况是,如果多次比较成立,则不更新列,其中一个比较列可能为空,Oracle 不比较空值。
本守则可能更容易理解。
UPDATE Temp_Table A Set T.ColZ = 'something'
WHERE NOT EXISTS
( SELECT * FROM Temp_Table B
WHERE A.ColF = B.ColF
AND ...more column comparisons
AND ((NVL(A.ColC, 'N/A') = NVL(B.ColC, 'N/A'))
AND more column Comparisons)
);
当 ColC 不包含 Null 时,更新有效,但是当我有一行 ColC 为 Null 时,尽管两边都相同,但它会被更新。
我也尝试在 where 子句中使用子查询,但没有运气。子查询会是在这里使用的更好方法吗?
非常感谢任何帮助或提示。
只是想补充一点,如果 col 为空,我想完全跳过比较,所以欢迎任何关于如何做到这一点的想法。谢谢
每个 Ypers 请求一个包含几行的示例......希望它足够清楚
Temp_Table
Col1 | Col2 | Col3 | Col4 |Col5 |Col6
AB | DC | EF | GH | 08 |
BA | CD | EF | GH | 08 |
AB | DC | HI | NULL| 05 |
AB | DC | JK | LM | 04 |
在上表中,第 1 行与第 2 行匹配。我的更新应该挑出没有对应行的行,如 3 和 4。当 Col4 不是 Null 时,我可以让它工作,但当该值为 Null 时它会失败。仅供参考,在 temp_table 中,任何具有 DC 值 Col1 的 Col2 都将 AB 作为其值,对于 Col2 中的任何 CD 值,Col1 将 BA 作为其值。
UPDATE Temp_Table T SET Col6 = 'Unmatched'
WHERE NOT EXISTS
( SELECT * FROM Temp_Table B
WHERE T.Col3 = B.Col3
AND T.COl4 = B.Col4
AND T.COl5 = B.Col5 )
希望有帮助,谢谢。