В SQL фигурирует значение NULL, функциональная роль которого заключается в обозначении отсутствующих или неизвестных данных. Для этого значения установлены правила выполнения предикатов, которые при участии NULL возвращают не TRUE или FALSE, а UNKNOWN, что вполне соответствует бытовой логике: если одно из данных отсутствует, то результат операции нам неизвестен. Но есть ли у такого расширения до троичной логики функциональная роль, или на практике, если заменить все UNKNOW на FALSE, то мы не заметим разницы? Насколько я знаю, от предиката требуется вернуть TRUE, чтобы произошло некоторое действие. Быть может, в разных реализациях это устроенно по разному? Буду рад каким-нибудь рассказам или ссылкам на эту тему.
- 7,195
- 10
- 37
- 66
- 157
2 Answers
Если заменить Unknown значения на False, то возникают неоднозначности:
Not False = True, но Not Unknown != True.
Из предыдущего следует False or Not False = True. Но Unknown or Not Unknown != True. Не всегда любое высказывание либо истинно, либо ложно.
Например:
Выведем продукты, которые стоят больше не больше 100:
select * from products t1 where not t1.price>100
В этом вариант в результат не попадут строки, в которых стоимость(price) не известна. Если же Unknown заменить на False, то в результат попали бы строчки, для которых стоимость не известна, что не соответствует истине.
PS
Справедливости ради надо сказать, что в данном примере запрос можно переписать для правильной работы в случае FALSE = Unknown
select * from products t1 where t1.price<=100
- 7,195
- 10
- 37
- 66
При выборке данных необходимо, чтобы предикат был TRUE.
При вставке данных в таблицу предикат не должен быть FALSE (т.е. TRUE или UNKNOWN).
- 7,195
- 10
- 37
- 66
- 1,066
То есть вопрос не о разнице между троичной и двоичной логиками, а о функциональном значении троичной логики в SQL.
– Akari Gale Jul 20 '17 at 12:56Oracle sqlUNKNOW и NULL - это одно и то же. Про сравнение справедливо. Я плохо выразил свои мысли, сейчас исправлю – Viktorov Jul 20 '17 at 13:05NOT UNKNOWN!=TRUE, аNOT FALSE=TRUE– Viktorov Jul 20 '17 at 13:23Ваш пример про замену касался price, но я говорю не о первичных данных, а о результатах выполнения предикатов.
– Akari Gale Jul 20 '17 at 13:26price > 100- это и есть предикат. Иnot price >100это тоже предикат. В общем я тогда не понимаю Ваш вопрос =( – Viktorov Jul 20 '17 at 13:29UNKNOWN. В троичной логике 3 значения -true, false, null. Предикаты на этих значениях возвращают в результате одно из этих же значений. Похоже на то, чтоunknownвводится просто для удобства – Viktorov Jul 20 '17 at 13:52