2009-10-09 4 views
1

다른 열의 두 열을 비교하려고합니다.오라클 비교 문제

예 :

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의에서가 아니라 TableB의에 값이있는 경우.

내 코드가 잘못되었습니다.

+0

a.Col1와 b에 대한 데이터 유형은 무엇입니까. Col1? –

답변

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 

을 그러나 요소 중 하나가 FALSE를 반환합니다 NULL 인 경우 (A의 행 예를 들어 B에 존재하지 않는 경우) 당신이 볼 수있다. 다만 케이스를 역방향 NULL 또는 B에 어떤 요소가있을 때 당신이 TRUE 얻고 싶은 경우에 :

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이 TRUE 나 FALSE도 있다는 사실에서 유래는 알 수없는 것입니다

업데이트 : 귀하의 코멘트에 대한 - 당신이 B A <가> 추가 조항 그렇게 할 수있을 때의 경우를 추가하려면 :

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'
WHEN a.col1 <> b .col1 및 to_char (sysdate, 'D') <> 7 그런 다음 'O' –