Почему нет особой обработки для CASE WHEN NULL в SQL? - PullRequest
2 голосов
/ 09 ноября 2011

В SQL невозможно сравнить переменную с NULL следующим образом:

CASE x WHEN NULL THEN y ELSE z END

потому что с трехзначной логикой SQL x = NULL не будет никогда возвращать true. Вместо этого нужно сделать это:

CASE WHEN x IS NULL THEN y ELSE z END

Это проблематично, когда x является результатом процедуры, которая изменяет данные, например:

CASE WHEN func(i) IS NULL THEN y
     WHEN func(i) = 'a'   THEN z
     ELSE                      t
 END

Итак ... func(i) будет оцениваться дважды? Почему не существует стандартного требования, согласно которому CASE ... WHEN NULL сравнивает вычисленное выражение с NULL с оператором IS NULL?

Существуют ли СУБД, которые допускают такую ​​конструкцию?

Ответы [ 3 ]

3 голосов
/ 09 ноября 2011

Это только одна из многих причин, по которым NULL является злом. Один из обходных путей - выбрать магическое значение в качестве суррогата для NULL:

CASE COALESCE(func(i), 'nada') WHEN 'nada' THEN y WHEN 'a' THEN z ELSE t END
2 голосов
/ 09 ноября 2011

Поскольку вы не гарантируете, что значения после WHEN являются просто литералами, не существует простого способа сделать это в особом случае, не вводя больше несогласованности или переписав SQL, чтобы NULL == NULL.

Напримересли выражение CASE func(i) WHEN Col1 THEN... и Col1 равно нулю в некоторых строках, но не в других ...

1 голос
/ 09 ноября 2011

Мне неизвестна СУБД, которая позволяет обойти это с помощью оператора case.

В Oracle вы можете переключиться на функцию декодирования:

decode( func(i), null, 'y', 'a', 'z')

В то время как Null! = Null - это обычный SQL, он считается равным при использовании оператора Decode в вашей логике.

...