我正在对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不包含空值时更新有效,但当我有一行ColC为空时,它会更新,尽管两边都是相同的。
我还尝试在where子句中使用子查询,但没有运气。子查询会在这里使用更好的方法吗?
非常感谢任何帮助或提示。
只是想添加一个理想情况下,如果col为null,我想完全跳过比较,所以任何关于如何以这种方式做到的想法都是受欢迎的。 感谢
每个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时它会失败。只有FYi在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 )
希望有所帮助和感谢。
答案 0 :(得分:2)
如果我理解正确,你想改变:
((NVL(A.ColC, 'N/A') = NVL(B.ColC, 'N/A'))
为:
(A.ColC = B.ColC OR A.ColC IS NULL OR B.ColC IS NULL)
问题更新后。
你可以试试这个:
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
AND NOT ( T.Col1 = B.Col1 --- all the other columns except Col6
AND T.Col2 = B.Col2
)
)