![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
maxipub |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Добрый день!
Таблица:
Запрос:
Результат:
Побочный результат: ![]() ![]() ![]() Это нормально, что при WHERE col_1 != col_2 MySQL не считает что 1 != NULL ? И как быть??? Это сообщение отредактировал(а) maxipub - 2.11.2016, 14:17 |
||||||
|
|||||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Запомни. ЛЮБОЕ сравнение, в котором фигурирует Null, всегда даёт Null, который интерпретируется как False. И неважно, на равенство или на неравенство. Исключение - маскирование функциями IFNULL() и COALESCE().
Проверять на Null. Отдельно. Либо, если есть некие значения, которые гарантированно отсутствуют в значении поля, использовать их. Например, если значения строго положительны, можно так:
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
1) Логический эквивалент null принято называть unknown 2) Не совсем верно утверждение, что Null (Unknown) интерпретируется как false. Unknown это третье, особенное состояние. Не даром эту логику называют трехзначной. Отличие от False очевидно на примере: not(False) = True, но not(Unknown) = Unknnown. Для трехзначной логики действует своя собственная таблица истинности, отличная от двухзначной логики. Например unknown and false = false, а unknown and true = unknown. К сожалению в доке масе, как и в доке по MsSQL это крайне плохо расписано. Очень хорошо мозг на место, мне лично, поставила дока по ораклу, где таблица истинности прописана явно, и явно выявлено состояние unknown. Результат Where condtition проверяется на ture, соответственно в нем результат Unknown возымеет тот же эффект, что и False. Однако, к примеру, Check condition проверяется на false, в нем Unknown будет работать так же как True Это сообщение отредактировал(а) Zloxa - 3.11.2016, 10:51 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
maxipub |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Akina, Zloxa, ребята, спасибо в очередной раз, все понятно разъяснили.
Единственное, так и не понял - зачем так делать? Если col_1 != col_2, значит нам надо все что не равно. Можно надумать что Unknown гипотетически может быть равен 1... Но ведь на о он и Unknown, что не 1. У нас же тут не какая-то теоретическая математика, а прагматичная СУБД. В этом плане мне логика PHP на 100% близка и рациональная с их логическим подходом к NULL. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
del
Это сообщение отредактировал(а) Zloxa - 3.11.2016, 11:01 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
Это все понапридумывали американцы. Закрепили это в своем ANSI. А русский человек теперь мучайся ![]() На самом деле, кода привыкнешь мыслить в трехзначной логике, на if (val==null) начинает жудко бомбить. Это сообщение отредактировал(а) Zloxa - 3.11.2016, 11:02 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
Порассуждали в курилке с пацанами на тему: "зачем бы в SQL использовалась трехзначная логика, коли от нее одни лишь проблемы". Пофантазировали на тему что было бы, будь она двузначна. Решили что было бы очень плохо. Если предполагать за Null неопределенное значение, то неопределенность мы можем сравнивать лишь на равенство(=) и строгое неравенство (!=). Операции "больше", "меньше", "между" с неопределенным значением возвращать должны неопределенный результат, а значит, в двузначной логике не представимы. Реализация двузначной логики привела бы к тому, что операции сравнения были бы запрещены для применения к наборам, содержащим неопределенные значения. Ввод третьего состояния логики решает эту проблему, но имеет свою цену в виде так не любимого всеми правила, что все операции сравнения с неопределенностью приводят к неизвестному результату. Это сообщение отредактировал(а) Zloxa - 3.11.2016, 12:59 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MySQL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |