1

我正在更新 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 )

希望有帮助,谢谢。

4

1 回答 1

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
            )
)
于 2012-03-06T22:55:11.523 回答