如果它不是空的,我如何比较自连接中的列?

时间:2012-03-06 22:49:00

标签: sql oracle subquery nvl

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

希望有所帮助和感谢。

1 个答案:

答案 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
            )
)