Выборка в условии запроса странно себя ведет
Добрый вечер уважаемые знатоки.
Столкнулся с неожиданным поведением в запросе.
Такой запрос
"выбрать
1
где не 1 в (выбрать null)"
возвращает нам единицу, а такой
"выбрать
1
где не 1 в (выбрать null объединить все выбрать 2)"
не возвращает ничего, результат пуст.
Кто-то с подобным сталкивался? Это нормальное поведение платформы или я что-то пропустил?
1С:Предприятие 8.3 (8.3.12.1616)
Столкнулся с неожиданным поведением в запросе.
Такой запрос
"выбрать
1
где не 1 в (выбрать null)"
возвращает нам единицу, а такой
"выбрать
1
где не 1 в (выбрать null объединить все выбрать 2)"
не возвращает ничего, результат пуст.
Кто-то с подобным сталкивался? Это нормальное поведение платформы или я что-то пропустил?
1С:Предприятие 8.3 (8.3.12.1616)
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Действительно какая-то ошибка:
В результате получаем два раза Нет (т.е. Ложь)
1С:Предприятие 8.3 (8.3.10.2639)
выбрать
1 в (выбрать 2 объединить все выбрать NULL) КАК В1,
1 НЕ в (выбрать 2 объединить все выбрать NULL) КАК В1НЕ
В результате получаем два раза Нет (т.е. Ложь)
1С:Предприятие 8.3 (8.3.10.2639)
Доброго вечера!
Насколько я знаю, сравнивать значения со значением null некорректно, т.к. никакое значение не может быть равно null, даже сам null. Для сравнения с null в языке запросов 1С есть выражение "есть null".
Насколько я знаю, сравнивать значения со значением null некорректно, т.к. никакое значение не может быть равно null, даже сам null. Для сравнения с null в языке запросов 1С есть выражение "есть null".
А вы еще вот такой вариант посмотрите и станет немного понятнее
выбрать
1
где не NULL в (выбрать null)
выбрать
1
где не NULL в (выбрать null)
Открываем любое определение пустого множества, хоть бы и википедию. Читаем внимательно.
1.
Поэтому
"выбрать
1
где не 1 в (выбрать null)"
возвращает нам единицу
2.
Т.е. {NULL}U{2}={2}
Поэтому
"выбрать
1
где не 1 в (выбрать null объединить все выбрать 2)"
не возвращает ничего
1.
Ни одно множество не является элементом пустого множества. Даже само пустое множество.
Поэтому
"выбрать
1
где не 1 в (выбрать null)"
возвращает нам единицу
2.
Объединение пустого множества с любым множеством равно последнему [указанному множеству]
Т.е. {NULL}U{2}={2}
Поэтому
"выбрать
1
где не 1 в (выбрать null объединить все выбрать 2)"
не возвращает ничего
(9) Замечательный, но не верный:
1. "Поэтому "выбрать 1 где 1 не в {2}" не возвращает ничего". Условие в предложении "где" Истина. Должно возвращать 1.
2. "выбрать null объединить все выбрать 2" возвращает {NULL, 2}.
Похоже на ошибку платформы. Все SQL запросы, приведенные ниже, ничего не возвращают.
1. "Поэтому "выбрать 1 где 1 не в {2}" не возвращает ничего". Условие в предложении "где" Истина. Должно возвращать 1.
2. "выбрать null объединить все выбрать 2" возвращает {NULL, 2}.
Похоже на ошибку платформы. Все SQL запросы, приведенные ниже, ничего не возвращают.
select 1 where not 1 in (select null)
select 1 where 1 in (select null)
select 1 where not 1 in (select null uni on all sel ect 2)
Из справки по ms sql
Синтаксис:
test_expression [ NOT ] IN
( subquery | expression [ ,...n ]
)
Из примечания к оператору "IN" ms sql:
Грубо говоря, отрицание неопределённости приведёт к той же неопределённости, которое внутри логического выражения всегда будет давать ЛОЖЬ. Однако, неопределённость возникнет только тогда, когда помимо значений NULL, нет других значений, удовлетворяющих проверке. Например:
1 В (NULL, 2) = неопределённость
НЕ 1 В (NULL, 2) = неопределённость
1 В (NULL, 1) = ИСТИНА
НЕ 1 В (NULL, 1) = ЛОЖЬ
А с первым запросом исключительная ситуация, из которой не следует делать какие-либо выводы о механизме работы оператора "В":
1С превращает в:
Поэтому результат: 1.
sql-запрос:
вернёт пустой результат.
Во всех остальных случаях платформа 1С ведёт себя как и ожидается.
Синтаксис:
test_expression [ NOT ] IN
( subquery | expression [ ,...n ]
)
Из примечания к оператору "IN" ms sql:
Для любых значений NULL, возвращаемых в subquery или expression, которые сравниваются со значением test_expression с помощью предложения IN или NOT IN, возвращается результат UNKNOWN. Использование значений NULL с предложениями IN или NOT IN может привести к непредвиденным результатам.
Грубо говоря, отрицание неопределённости приведёт к той же неопределённости, которое внутри логического выражения всегда будет давать ЛОЖЬ. Однако, неопределённость возникнет только тогда, когда помимо значений NULL, нет других значений, удовлетворяющих проверке. Например:
1 В (NULL, 2) = неопределённость
НЕ 1 В (NULL, 2) = неопределённость
1 В (NULL, 1) = ИСТИНА
НЕ 1 В (NULL, 1) = ЛОЖЬ
А с первым запросом исключительная ситуация, из которой не следует делать какие-либо выводы о механизме работы оператора "В":
ВЫБРАТЬ
1
ГДЕ НЕ 1 В (ВЫБРАТЬ NULL)
1С превращает в:
SELECT
1.0
WHERE (NOT ((1=0)))
Поэтому результат: 1.
sql-запрос:
select
1
where not 1 in (select null)
вернёт пустой результат.
Во всех остальных случаях платформа 1С ведёт себя как и ожидается.
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот