Выборка в условии запроса странно себя ведет

1. rеd80 15.10.18 17:05 Сейчас в теме
Добрый вечер уважаемые знатоки.

Столкнулся с неожиданным поведением в запросе.
Такой запрос
"выбрать
1
где не 1 в (выбрать null)"
возвращает нам единицу, а такой
"выбрать
1
где не 1 в (выбрать null объединить все выбрать 2)"
не возвращает ничего, результат пуст.

Кто-то с подобным сталкивался? Это нормальное поведение платформы или я что-то пропустил?
1С:Предприятие 8.3 (8.3.12.1616)
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. Vitaly1C8 15.10.18 17:51 Сейчас в теме
(1) Действительно какая-то ошибка:
выбрать
1 в (выбрать 2 объединить все выбрать NULL) КАК В1,
1 НЕ в (выбрать 2 объединить все выбрать NULL) КАК В1НЕ

В результате получаем два раза Нет (т.е. Ложь)
1С:Предприятие 8.3 (8.3.10.2639)
+
2. shilanser 15.10.18 17:22 Сейчас в теме
Доброго вечера!
Насколько я знаю, сравнивать значения со значением null некорректно, т.к. никакое значение не может быть равно null, даже сам null. Для сравнения с null в языке запросов 1С есть выражение "есть null".
user811769; alex-l19041; +2
3. rеd80 15.10.18 17:33 Сейчас в теме
(2) Я всегда считал что выражения, в которых участвует null всегда возвращают null. В условии null всегда возвращает false. Тут же какое-то непонятное поведение.
+
4. dka80 20 15.10.18 17:46 Сейчас в теме
Null <> Null
Проверка на Null выполняется конструкцией Есть Null
+
5. YannikAlx 43 15.10.18 17:50 Сейчас в теме
А вы еще вот такой вариант посмотрите и станет немного понятнее

выбрать
1
где не NULL в (выбрать null)
+
7. rеd80 16.10.18 09:17 Сейчас в теме
(5) Понятнее не стало.
+
8. catena 110 16.10.18 09:51 Сейчас в теме
Открываем любое определение пустого множества, хоть бы и википедию. Читаем внимательно.

1.
Ни одно множество не является элементом пустого множества. Даже само пустое множество.

Поэтому
"выбрать
1
где не 1 в (выбрать null)"
возвращает нам единицу


2.
Объединение пустого множества с любым множеством равно последнему [указанному множеству]

Т.е. {NULL}U{2}={2}
Поэтому
"выбрать
1
где не 1 в (выбрать null объединить все выбрать 2)"
не возвращает ничего
Cерый; user811769; YannikAlx; +3
9. YannikAlx 43 16.10.18 12:53 Сейчас в теме
(8) Замечательный ответ!
+
10. VZyryanov 16.10.18 14:22 Сейчас в теме
(9) Замечательный, но не верный:
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)
+
11. SlavaKron 16.10.18 22:02 Сейчас в теме
Из справки по ms sql
Синтаксис:
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С ведёт себя как и ожидается.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот