Проблема сравнения Oracle - PullRequest
       13

Проблема сравнения Oracle

1 голос
/ 09 октября 2009

Я пытаюсь сравнить два столбца из разных столбцов.

Ex:

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

Я всегда получаю false, но не true, даже если они отличаются или если есть значение в TableA, а не в TableB.

Что не так с моим кодом?

1 Ответ

3 голосов
/ 09 октября 2009

Ваш запрос кажется правильным:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...