我試圖比較不同列中的兩列。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的值。
我的代碼有什麼問題?
我試圖比較不同列中的兩列。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的值。
我的代碼有什麼問題?
您的查詢似乎是正確的:
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;
是的你是對的,但如果我想添加額外的表達式,如 當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
哪些a.Col1和b的數據類型。 COL1? – 2009-10-09 15:39:34