2009-10-09 115 views
1

我试图比较不同列中的两列。Oracle比较问题

例:

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中,而不是在表B的值。

我的代码有什么问题?

+0

哪些a.Col1和b的数据类型。 COL1? – 2009-10-09 15:39:34

回答

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(当从某行不以B为例存在)。如果你想获得TRUE时,有一个空或B中没有元素只是反转的情况下:

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既不是真也不是假,它是未知

更新:关于你的评论 - 如果你想添加的情况下,当一个<> 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; 
+0

是的你是对的,但如果我想添加额外的表达式,如 当a.col1 <> b.col1和to_char(sysdate,'D')= 7然后'S'
当a.col1 <> b .col1和to_char(sysdate,'D')<> 7然后'O' – 2009-10-09 15:42:27