В SQL фигурирует значение NULL, функциональная роль которого заключается в обозначении отсутствующих или неизвестных данных. Для этого значения установлены правила выполнения предикатов, которые при участии NULL возвращают не TRUE или FALSE, а UNKNOWN, что вполне соответствует бытовой логике: если одно из данных отсутствует, то результат операции нам неизвестен. Но есть ли у такого расширения до троичной логики функциональная роль, или на практике, если заменить все UNKNOW на FALSE, то мы не заметим разницы? Насколько я знаю, от предиката требуется вернуть TRUE, чтобы произошло некоторое действие. Быть может, в разных реализациях это устроенно по разному? Буду рад каким-нибудь рассказам или ссылкам на эту тему.
Ответ
Если заменить 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
Комментариев нет:
Отправить комментарий