Является ли следующий самый простой способ написать IS NOT DISTINCT FROM без использования этого предложения?
ColA IS NULL AND ColB IS NOT NULL
OR ColA IS NOT NULL AND ColB IS NULL
OR ColA != ColB
Или есть более простой способ?
Почему образцы данных могут помочь? Все, что для этого требуется, это знание того, что НЕ ОТЛИЧАЕТСЯ ОТ


Более простой способ — использовать NOT из метода Equals, чтобы написать его. Например:
WITH tbl(colA, colB) AS (
SELECT 1,2 UNION ALL
SELECT NULL,1 UNION ALL
SELECT 1,NULL UNION ALL
SELECT NULL,NULL
)
SELECT
colA,
colB,
colA=colB OR (colA IS NULL AND colB IS NULL) eq,
NOT( colA=colB OR (colA IS NULL AND colB IS NULL) ) neq
FROM
tbl
IS DISTINCT FROM.
@lemon извините, я не понимаю, не могли бы вы уточнить? У меня это работает: gyazo.com/34b16e330696c1d7f7db2c4f661578b9.
Разве cola<>colb и Not (cola<>colb) недостаточно для значения отличной от этой причины, поскольку NULLS возвращает разные значения для разных столбцов или строк
Конструктор таблиц values более лаконичен, чем union all
Вам необходимо рассмотреть все возможные крайние случаи для вашего варианта использования, которые я включил по предоставленной ссылке в моем первом комментарии.
Когда вам удается использовать условия, которые дают вам вывод IS DISTINCT FROM во всех возможных крайних случаях, и отрицание вашего полного набора условий дает вам точный результат IS NOT DISTINCT FROM, тогда вы можете сказать, что нашли набор условий, которые могут заменить это оператор.
Я не понял, что вы спрашиваете здесь, на примере. Но вот более простая версия вашего запроса
Select *, case when distinct_from_v1 = 1 then 0 else 1 end as not_distinct_from_v1
from
(SELECT colA, colB,
CASE WHEN colA IS DISTINCT FROM colB THEN 1 ELSE 0 END AS distinct_from,
case when Cola + colb is not null
then
case when cola=colb then 0
else 1
end
else
case when concat(cola,colb) in (cola,colb) then 1 else 0 end
end as distinct_from_v1
FROM tab) t;
Рабочая рабочий пример https://dbfiddle.uk/aVKsWNvz
Он работает почти во всех базах данных || поддерживается и в Sql Server.
IS (NOT) DISTINCT FROM.
@lemon работает нормально, я представил 0 как ложь, а 1 как истину. только в случаях обоих нулей это разные
Одного невыполненного условия достаточно, чтобы он сам по себе был другим оператором. Два оператора эквивалентны только тогда, когда они ведут себя одинаково при любых условиях.
@lemon проверь сейчас
Вы можете сохранить значение во вложенном запросе и выполнить NOT во внешнем запросе.
Еще раз отредактировал, проверьте.
IS [NOT] DISTINCT FROM — самый простой способ сделать это.
В предыдущих версиях можно было сделать (Fiddle)
EXISTS (SELECT colA INTERSECT SELECT colB) за IS NOT DISTINCTEXISTS (SELECT colA EXCEPT SELECT colB) за IS DISTINCTхотя более подробно
NOT EXISTS (SELECT colA INTERSECT SELECT colB)иногда дает лучший план выполнения для случая IS DISTINCT (пример).
См. Недокументированные планы запросов: сравнение равенства для обсуждения различных альтернативных подходов к этому.
Как правило, я обнаружил, что планы выполнения подходят для описанных выше подходов, хотя иногда я обнаруживал, что записываю условие полностью как
WHERE ColA = ColB OR (ColA IS NULL AND ColB IS NULL) (для случая NOT DISTINCT)WHERE ColA <> ColB OR (ColA IS NULL AND ColB IS NOT NULL) OR (ColA IS NOT NULL AND ColB IS NULL) (для случая DISTINCT)дает лучший план выполнения.
INTERSECT/EXCEPT очень удобны, когда вам нужно сделать этот тип сравнения по нескольким столбцам...
EXISTS (SELECT t1.colA, t1.colB, t1.colC
INTERSECT
SELECT t2.colA, t2.colB, t2.colC)
... но проверьте планы, чтобы убедиться, что они эффективно оптимизируются в том контексте, в котором вы их используете.
спасибо за этот ответ, это, конечно, правильно. Не уверен, почему так много людей проголосовали против / закрыли вопрос, возможно, люди не знают, что означает IS DISTINCT FROM.
Вам, безусловно, понадобятся скобки вокруг разделов и , если вы хотите, чтобы это работало.