我试图比较不同列中的两列。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