Есть закон тождества, гласящий, что x=x. Что очевидно и интуитивно и по другому быть не может.
И выражение x=x and y=1 можно смело сократить до y=1
Это вроде всё очевидно и интуитивно понятно.
Однако если это критерий для выборки из таблицы БД, то нет.
Так как если x=null, то по правилам операций в БД всё выражение становится null, что уже как-то очень странно.
Как же тогда тождество? И если null по сути — значение не известно, то сравнения с тем же самым "не известным" логично бы чтоб было true (в этом случае закон тождества не нарушается).
Если мы точно знаем что источник неизвестности один и тот же, то вполне ок считать что эти значения равны.
Вот если мы этого не знаем, тогда да, логично что результат выражения будет null.
Что за хня? почему так? какая за этим логика мотивирующая такое поведение (что нарушается закон тождества и нельзя делать такие упрощения выражений фильтров)?
MH>Что за хня? почему так? какая за этим логика мотивирующая такое поведение (что нарушается закон тождества и нельзя делать такие упрощения выражений фильтров)?
select
case a
when 1 then '111'
when 2 then '222'
when 3 then null-- 3else null-- 4end
from t
Здравствуйте, MadHuman, Вы писали:
MH>Что за хня? почему так? какая за этим логика мотивирующая такое поведение (что нарушается закон тождества и нельзя делать такие упрощения выражений фильтров)?
Потому что с появлением NULL — это уже трехзначная логика.
Можно заменить NULL на Неизвестное Значение и спросить каким должен быть результат операции "Неизвестное значение равно неизвестному значению?". Логично было бы ответить — неизвестно
Ну, или представить, что в обычной двухзначной логике выражение X = Y можно представить как !(X < Y) && !(X > Y). И если X и Н — это NULL (неизвестные значения), задать вопрос неизвестное значение меньше неизвестного значения? Очевидно, что неизвестно. Тоже и для оператора больше. Поэтому второе выражение должно иметь результат — неизвестно. И первое получается — тоже.
Даже, если представить, что NULL — это некое специальное значение, которое эквивалентно себе, но никогда неравно другим значениям (этого можно добиться, например, с помощью SET ANSI_NULLS OFF), то все равно комбинации операции сравнение не будут давать тот же результат, что и операция равно. Т.е. будут противоречия.
null — это абстрактное значение, введённое для того, чтобы его не путали с числами, строками, булевыми значениями и т.п. В ряде случаев null означает, что "значение не определено". Но далеко не во всех случаях.
Д>Можно заменить NULL на Неизвестное Значение и спросить каким должен быть результат операции "Неизвестное значение равно неизвестному значению?". Логично было бы ответить — неизвестно
это зависит. если за x взять возрост конкретного человека, и он неизвестен (то есть представлен null-ом), то очевидно что в этом случае x=x истинно. как возрост человека не может быть равен его же возросту (даже если мы его не знаем)?
Д>Ну, или представить, что в обычной двухзначной логике выражение X = Y можно представить как !(X < Y) && !(X > Y). И если X и Н — это NULL (неизвестные значения), задать вопрос неизвестное значение меньше неизвестного значения? Очевидно, что неизвестно. Тоже и для оператора больше. Поэтому второе выражение должно иметь результат — неизвестно. И первое получается — тоже.
в случае "неизвестное значение меньше неизвестного значения?" результат — неизвестно — да, это очевидно. так как если нет никакой дополнительной информации о происхождении неизвестности мы действительно ничего не можем утверждать (больше значение или меньше), поэтому результат — неизвестно, вполне логичен.
Д>Даже, если представить, что NULL — это некое специальное значение, которое эквивалентно себе, но никогда неравно другим значениям (этого можно добиться, например, с помощью SET ANSI_NULLS OFF), то все равно комбинации операции сравнение не будут давать тот же результат, что и операция равно. Т.е. будут противоречия.
это не то. два разных null-а о происхождении которых мы не знаем, действительно мы не можем утверждать что это равные значения.
но когда это неизвестность из одного источника, то x=x можно и логично считать истинным.
Здравствуйте, L.K., Вы писали:
MH>>И если null по сути — значение не известно
LK>null — это абстрактное значение, введённое для того, чтобы его не путали с числами, строками, булевыми значениями и т.п. В ряде случаев null означает, что "значение не определено". Но далеко не во всех случаях.
это понятно.
непонятно как может закон тождества нарушаться. даже если вместо X мы подставляем это специальное абстрактное значение. в случае тождества это одно и тоже.
Здравствуйте, MadHuman, Вы писали:
MH>это зависит. если за x взять возрост конкретного человека, и он неизвестен (то есть представлен null-ом), то очевидно что в этом случае x=x истинно. как возрост человека не может быть равен его же возросту (даже если мы его не знаем)? MH>но когда это неизвестность из одного источника, то x=x можно и логично считать истинным.
А каким образом описать, что данные из одного источника? Нет, я понимаю, что в программировании можно перезагрузить оператор сравнения и сделать так, чтобы он проверял, например, равенство указателей, а не только значений. Но это уже за пределами математической логики... Можно, конечно, сказать, что если x — NULL, то x = x, тоже должно быть NULL. а вот если x = NULL и y = NULL, то x = y должно быть NULL. Но зачем так усложнять и что, например, делать с выражениями вроде x = x + 0.
Опять же SQL оперирует кортежами сущностей. Т.е. таблица людей и в ней есть атрибут возраст. В общем случае запросы будут выглядеть — выбрать людей с одинаковым возрастом или выбрать людей, у которых возраст равен заданному.
Д>А каким образом описать, что данные из одного источника?
В случае тождества x=x, это видно.
Д>Нет, я понимаю, что в программировании можно перезагрузить оператор сравнения и сделать так, чтобы он проверял, например, равенство указателей, а не только значений. Но это уже за пределами математической логики... Можно, конечно, сказать, что если x — NULL, то x = x, тоже должно быть NULL. а вот если x = NULL и y = NULL, то x = y должно быть NULL. Но зачем так усложнять и что, например, делать с выражениями вроде x = x + 0.
Вообщем-то я не говорю о том что надо всё усложнять и тотально отслеживать источник NULL-а (хотя может и есть в этом смысл, это отдельный и непростой вопрос), я говорю о том что в условиях отбора тождество можно сокращать и тем самым упрощать выражение условия отбора.
Д>Опять же SQL оперирует кортежами сущностей. Т.е. таблица людей и в ней есть атрибут возраст. В общем случае запросы будут выглядеть — выбрать людей с одинаковым возрастом или выбрать людей, у которых возраст равен заданному.
Да, и что? в любом случае если сравнивается атрибут возрост конкретного человека со своим же возрастом, то по здравому смыслу очевидно что они равны и тождество соблюдено, даже если этот атрибут у этого конкретного человека null.
И конечно при выборке людей с заданным возрастом, очевидно что мы не можем включать в выборку людей у которых возрост не задан (=null).
Я понимаю что такое null в БД и зачем. Я не понимаю почему в условиях отбора x=x нельзя отбросить и такая добавка реально влияет на выборку (записи где x равен null не выбираются).
Здравствуйте, MadHuman, Вы писали:
MH>Что за хня? почему так?
Потому что в противном случае... нарушается закон тождества.
Закон тождества гласит, что каждое понятие должно сохранять своё однозначное значение на протяжении всего рассуждения. (А вовсе не что x=x).
Понятие "сравнение null с любым значением даёт результат null" по закону тождества не должно иметь исключения в виде "но если null выражен через переменную, то сравнение переменной самой с собой должно давать результат true".
Здравствуйте, _ABC_, Вы писали:
_AB>Потому что в противном случае... нарушается закон тождества. _AB>Закон тождества гласит, что каждое понятие должно сохранять своё однозначное значение на протяжении всего рассуждения. (А вовсе не что x=x).
И в чем тут нарушение? если за Х принять например твой возрост, я его не знаю (придам значение null), и согласно "понятие должно сохранять своё однозначное значение" это понятие должно быть одинаково во всем рассуждении, а следовательно равно самому себе.
Здравствуйте, MadHuman, Вы писали:
MH>Я не понимаю почему в условиях отбора x=x нельзя отбросить и такая добавка реально влияет на выборку (записи где x равен null не выбираются).
Навесь на поле x ограничение not null и можно будет отбросить (и продвинутая СУБД будет отбрасывать). Доволен?
Здравствуйте, MadHuman, Вы писали:
MH>И в чем тут нарушение?
Ты читать умеешь?
Понятие "сравнение null с любым значением даёт результат null" по закону тождества не должно иметь исключения в виде "но если null выражен через переменную, то сравнение переменной самой с собой должно давать результат true".
MH>если за Х принять например твой возрост,
Возраст. Пожалуйста, проявляй уважение к собеседникам и их кровоточащам глазам.
MH>я его не знаю (придам значение null), и согласно "понятие должно сохранять своё однозначное значение" это понятие должно быть одинаково во всем рассуждении, а следовательно равно самому себе.
Ты очень многое путаешь.
1. Возраст — это не понятие. Это признак объекта или его характеристика. А null применительно к возрасту — это параметр, конкретное значение из списка возможных этого признака или характеристики.
2. Понятие — это мысль, которая категоризирует или выделяет какие-либо объекты по каким-либо характеристикам в определенное множество, в класс, так сказать.
Вообще, мне стоило употребить слово "высказывание"/"суждение", а не "понятие", но давно я уже не освежал знания по формальной логике.
3. Суждение или высказывание — мысль, содержащая наличие или отсутствие связи между объектами и признаками.
Поэтому правильнее будет сформулировать так:
Суждение "сравнение null с любым значением даёт результат null" по закону тождества не должно иметь исключения в виде "но если null выражен через переменную, то сравнение переменной самой с собой должно давать результат true".
W>Навесь на поле x ограничение not null и можно будет отбросить (и продвинутая СУБД будет отбрасывать). Доволен?
нет. ты говориш очевидную вещь. вопрос не об этом.
Здравствуйте, MadHuman, Вы писали:
MH> Если мы точно знаем что источник неизвестности один и тот же, то вполне ок считать что эти значения равны. MH> Вот если мы этого не знаем, тогда да, логично что результат выражения будет null.
По-моему более понятно становится если null считать не неизвестностью, а отсутствием значения.
Тогда оно хорошо согласуется с тем, что left/right join даёт null в колонках при отсутствии записи в заджойненной таблице.
Тогда обычные булевы операции типа = <> становятся неприменимы, ибо нечего сравнивать — результат сравнения тоже отсутствует.
И никаких "источников неизвестности" не надо. Просто источник пуст.
Монада Maybe.
Д>>А каким образом описать, что данные из одного источника? MH>В случае тождества x=x, это видно.
Погоди, а какой смысл сравнивать х и х? Ну, кроме как отбросить null, хотя для этого есть способ и получше.
Здравствуйте, Muxa, Вы писали:
M>Погоди, а какой смысл сравнивать х и х? Ну, кроме как отбросить null, хотя для этого есть способ и получше.
Есть определённый "упроститель" критериев отбора определяемых юзерами фильтров, он упрощает критерий прежде чем сгенерить sql для запроса в БД.
И возникла дилемма что делать с x=x
Конечно практического смысла руками осмысленно писать такой критерий в sql нет. Но он (x=x) может появиться после ряда упрощений исходного более сложного фильтра, либо в его части.
Здравствуйте, MadHuman, Вы писали: MH>Есть закон тождества, гласящий, что x=x. Что очевидно и интуитивно и по другому быть не может. MH>И выражение x=x and y=1 можно смело сократить до y=1 MH>Это вроде всё очевидно и интуитивно понятно.
Ну, из меня подобную дурь выбили на втором курсе универа, в процессе изучения дифур. В общем говоря — так делать нельзя, ты теряешь область значений функции. А тождество работает только там.
MH>Что за хня? почему так? какая за этим логика мотивирующая такое поведение (что нарушается закон тождества и нельзя делать такие упрощения выражений фильтров)?
Это нормально. Ничего не нарушается.
Всё, что нас не убивает, ещё горько об этом пожалеет.
Здравствуйте, Ромашка, Вы писали:
MH>>Что за хня? почему так? какая за этим логика мотивирующая такое поведение (что нарушается закон тождества и нельзя делать такие упрощения выражений фильтров)?
Р>Это нормально. Ничего не нарушается.
ну ок, допустим такое поведение ничего не нарушает. тогда допустим, что если поведение интуитивно (когда тождество x=x всегда истинно), то что нарушится?