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: Я в конец запутался ... Хрен с ним ... Уж обошёл ... Но ...

С уважением,
Константин Григорьевич.
===============


Ответить