Ваш запрос кажется правильным:
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 или нет элемента, просто измените регистр:
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
не является ИСТИННЫМ или ЛОЖНЫМ, НЕИЗВЕСТНО
Обновление: относительно вашего комментария - если вы хотите добавить случаи, когда a <> 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;