2009-10-09 127 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