Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

Троичная логика в SQL

#sql


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


Ответы

Ответ 1



Если заменить 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

Ответ 2



При выборке данных необходимо, чтобы предикат был TRUE. При вставке данных в таблицу предикат не должен быть FALSE (т.е. TRUE или UNKNOWN).

Комментариев нет:

Отправить комментарий