KB> Hi Константин !
К>> select 'OK' from rdb$database where 0 not in (1,2)
К>> select 'OK' from rdb$database where not ((0 = 1) or (0 = 2)) =
true
KB> 3-я строчка так:
KB> select 'OK' from rdb$database where (0 <> 1) *AND* (0 <> 2) =
true
KB> и соответственно 4-я тоже неправильно
Блин, хорошо, соглавен, неправ ..., НО ..
Выдержка из:
http://www.firebirdsql.org/manual/ru/nullguide-dealing-with-nulls-ru.html
{Цытата}
Однако откажитесь от идеи инвертирования выражения и использования его как
проверки
на неэквивалентность (как я это однажды сделал):
/* Не делайте так! */
if (not(A = B or A is null and B is null))
then ...код для выполнения, если A отличается от B...
Приведенный выше код работает корректно, если оба A и B являются NULL или
оба не являются NULL.
Но в нем не выполняется предложение then, если только одна из частей (A или
B) является NULL.
Если вы хотите выполнять что-либо, когда A и B отличаются, вы должны либо
использовать корректное
выражение, приведенное выше, и поместить пустой оператор в предложение
then, или использовать это
более длинное выражение для проверки:
/* Это корректный тест на неэквивалентность: */
if (A <> B
or A is null and B is not null
or A is not null and B is null) then...
{/Цытата}
Что-то много противоречий ...
Подобного кода в разложении not in я не встретид ...
Где правда ?
PS: Я в конец запутался ... Хрен с ним ... Уж обошёл ... Но ...
С уважением,
Константин Григорьевич.
===============