Я пытаюсь выяснить, самый простой обобщенный выражение SQL, который может проверить, если две колонки a
и b
одинаковы. Другими словами, выражение, которое вычисляется в true
, когда:выражение Простейшее SQL, чтобы проверить, если два столбца имеют одинаковое значение для учета NULL
a
являетсяNULL
иb
являетсяNULL
; илиa
неNULL
иb
неNULL
иa = b
Пусть столбцы a
и b
имеют точно такой же тип данных.
Наиболее очевидное решение, которое я использую в примере ниже, это ужасно запутанным, особенно потому, что мне нужно повторить этот пункт 15x в 15 столбцов таблицы:
SELECT * FROM (
SELECT 'x' a, 'x' b FROM dual
UNION ALL
SELECT 'x' a, NULL b FROM dual
UNION ALL
SELECT NULL a, 'x' b FROM dual
UNION ALL
SELECT NULL a, NULL b FROM dual
UNION ALL
SELECT 'x' a, 'y' b FROM dual
UNION ALL
SELECT 'x' a, NULL b FROM dual
UNION ALL
SELECT NULL a, 'y' b FROM dual
UNION ALL
SELECT NULL a, NULL b FROM dual
)
WHERE (a IS NULL AND b IS NULL) OR
(a IS NOT NULL AND b IS NOT NULL AND a = b)
/
и ожидаемый результат является:
+--------+--------+
| a | b |
+--------+--------+
| x | x |
| (null) | (null) |
| (null) | (null) |
+--------+--------+
Т.Л., др - Могу ли я упростить мою статью WHERE
, т.е. сделать его более компактным, сохраняя при этом его логически правильно?
P.S .: Я не мог наплевать на любые попытки пуриста SQL, что «NULL
не является значением». Для моих практических целей, если a
содержит NULL
и b
не делают, то a
отличаются от b
. Они не «неизвестны», отличаются ли они. Поэтому, пожалуйста, заранее, никаких аргументов в этой переулке!
P.P.S .: Мой вкус SQL - это Oracle 11g.
PPPS: Кто-то решил, что этот вопрос является дубликатом «Is there better Oracle operator to do null-safe equality check?», но беглая проверка в этом вопросе будет показано, что ответы на них менее полезны, чем те, которые размещен на эту тему и не удовлетворяют моего частности, и explicitly- заявленные критерии. Просто потому, что они похожи, они не дублируют их. Я никогда не понимал, почему люди на SO так усердно работают, чтобы заставить мою проблему X быть чужой проблемой. Y.
Я обычно использую функцию 'ISNULL()' в SQL Server, я думаю, что 'NVL()' эквивалентен в Oracle, может быть, попытаться взглянуть на эту функцию? – xbb
NVL() не работает. LNNVL должен работать. – EvilTeach
'LNNVL' в этом дублирующем вопросе именно то, что вы ищете. – Noel