@wideShift

Несколько вопросов про NULL?

1) NULL же при сравнении с любым типом возвращает NULL?
2) NULL расценивается как false?
3) Почему нельзя напрямую сравнивать с NULL (myfield = NULL), а использовать IS NULL/IS NOT NULL? Почему такая логика?
  • Вопрос задан
  • 93 просмотра
Решения вопроса 2
@galaxy
1) При использовании операторов =, <, >, <> - да
2) Нет. Но при этом он не является true, т.е. при использовании в WHERE или JOIN условие с ним сработает как ложное. Ну и вне БД, например, в PHP и других слабо типизированных языках он легко превращается в false
3) Странный вопрос какой-то, перевернутый. Операторы IS NULL/IS NOT NULL придумали потому, что сравнение с NULL обычными операторами работает не так, как все привыкли. Вообще, в SQL троичная логика (на примере =):
=     | TRUE    FALSE   NULL
________________________________
TRUE  | TRUE    FALSE   NULL
FALSE | FALSE   TRUE    NULL
NULL  | NULL    NULL    NULL
Ответ написан
Комментировать
BorLaze
@BorLaze
Java developer
Достаточно держать в памяти, что есть три варианта ответа - да/нет/что угодно (true/false/null), и тут же все станет понятно:

1) Да. "что угодно" = "что-то конкретное" дает "что угодно, потому-то слева может быть и правое значение, и любое другое.
2) Нет. См. п.1.
3) Нельзя, потому что п.1.

То есть, можно представить себе, что в null может быть любое значение - как равное конкретному, с которым мы сравниваем, так и не равное. Поэтому результат тоже может быть любым.

Собственно, этого мнемонического правила вполне достаточно, чтобы не делать ошибок при запросах к БД.

UPD: или же можно трактовать null как функцию random() - так еще понятней.
1) 1 = random()? А кто его знает - может, равно, а может, и нет... то есть ответ рандомный.
2) random() это false? Может, да, а может, и нет... в общем, все тот же рандом.
3) Из вышеизложенного вытекает, что любое сравнение какого-то конкретного значения с рандомным дает рандомный результат. А операторы IS NULL/IS NOT NULL как раз работают как "это рандом?" и "это не рандом?" - поэтому для работы с null надо использовать именно их.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы