Oracle比较问题

时间:2009-10-09 15:23:14

标签: sql oracle oracle10g

我正在尝试比较来自不同列的两列。

例如:

Select a.Col1, b.Col1,
CASE
WHEN a.Col1 <> b.Col1 THEN 'TRUE'
ELSE 'FALSE'
END CASE
FROM TableA a LEFT OUTER JOIN TableB b ON a.id = b.id

我总是假的,但不是真的,即使它们不同,或者TableA中有值,而不是TableB。

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:3)

您的查询似乎正确无误:

SQL> WITH tableA AS (SELECT 1 ID, 'A' col1 FROM dual
  2                  UNION ALL SELECT 2 ID, 'B' FROM dual),
  3       tableB AS (SELECT 1 ID, 'B' col1 FROM dual)
  4  SELECT a.Col1, b.Col1,
  5         CASE
  6            WHEN a.Col1 <> b.Col1 THEN
  7             'TRUE'
  8            ELSE
  9             'FALSE'
 10         END CASE
 11    FROM TableA a
 12    LEFT OUTER JOIN TableB b ON a.id = b.id;

COL1 COL1 CASE
---- ---- -----
A    B    TRUE
B         FALSE

然而,你可以看到其中一个元素是否为NULL,它将返回FALSE(例如,当A中的一行不存在于B中时)。如果你想在B中存在NULL或没有元素时获得TRUE,只需反转大小写:

SQL> WITH tableA AS (SELECT 1 ID, 'A' col1 FROM dual
  2                  UNION ALL SELECT 2 ID, 'B' FROM dual),
  3       tableB AS (SELECT 1 ID, 'B' col1 FROM dual)
  4  SELECT a.Col1, b.Col1,
  5         CASE
  6            WHEN a.Col1 = b.Col1 THEN
  7             'FALSE'
  8            ELSE
  9             'TRUE'
 10         END CASE
 11    FROM TableA a
 12    LEFT OUTER JOIN TableB b ON a.id = b.id;

COL1 COL1 CASE
---- ---- -----
A    B    TRUE
B         TRUE

这种行为来自于如果b为NULL,则a <> b既不是TRUE也不是FALSE,它是UNKNOWN

更新关于您的评论 - 如果您想在&lt;&gt;时添加案例b你可以在额外的WHEN条款中这样做:

SELECT a.Col1, b.Col1,
       CASE
          WHEN a.Col1 = b.Col1 THEN
           'FALSE'
          WHEN to_char(SYSDATE, 'D') = 7 THEN
           'S'
          ELSE
           'O'
       END CASE
  FROM TableA a
  LEFT OUTER JOIN TableB b ON a.id = b.id;