Нет соединения по NULL

1. ink 19.10.23 17:46 Сейчас в теме
Есть у меня запрос. Фактически таблица у которой одно поле NULL. Я соединяю таблицу с точно такой же по двум полям и хочу получить результирующую с таким же количеством строк. Так вот по полю, в котором NULL равенство не получается, то есть выражение NULL = NULL всегда дает Ложь. Пример ниже.

Скажите, пожалуйста, это всегда так было или у меня у платформы какие-то особенности? Как-то странно, что раньше я такого не замечал. Релиз 1С:Предприятие 8.3 (8.3.23.1782)

ВЫБРАТЬ ПЕРВЫЕ 1
	"Й" КАК Номенклатура,
	NULL КАК ВидЦены
ПОМЕСТИТЬ Таб1
ИЗ Справочник.Номенклатура КАК НН
;
ВЫБРАТЬ
	ЕСТЬNULL(ЦН.Номенклатура, ЦС.Номенклатура) КАК Номенклатура,
	ЕСТЬNULL(ЦН.ВидЦены, ЦС.ВидЦены) КАК ВидЦены,
	ЦН.Номенклатура КАК Номенклатура1,
	ЦН.ВидЦены КАК ВидЦены1,
	ЦС.Номенклатура КАК Номенклатура2,
	ЦС.ВидЦены КАК ВидЦены2
ИЗ Таб1 КАК ЦН
		ПОЛНОЕ СОЕДИНЕНИЕ Таб1 КАК ЦС
		ПО ЦН.Номенклатура = ЦС.Номенклатура
			И ЦН.ВидЦены = ЦС.ВидЦены
Показать


Результат работы: таблица из двух строк.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 35 19.10.23 17:48 Сейчас в теме
(1) Всегда
NULL не равен ничему.
3. ink 19.10.23 18:12 Сейчас в теме
(2) Спасибо за ответ. Но как же тогда соединения таблиц? Получается, что на пустом месте в выходной таблице формируется задвоение строк?

Как этого избежать? Конструкцией ЕСТЬNULL()? Получается, надо предусматривать заранее, что значения может не быть и заменять NULL на пустую строку или пустую ссылку?

Может, есть какой-то более простой способ соединить две таблицы с Null?
6. Sashares 35 19.10.23 19:57 Сейчас в теме
(3)
Как этого избежать? Конструкцией ЕСТЬNULL()? Получается, надо предусматривать заранее, что значения может не быть и заменять NULL на пустую строку или пустую ссылку?

Да

Может, есть какой-то более простой способ соединить две таблицы с Null?

Можно попробовать в условие соединения добавить. Типо такого:
А = Б
ИЛИ А Есть Null
И Б Есть Null
4. Said-We 19.10.23 18:22 Сейчас в теме
(1)
Я соединяю таблицу с точно такой же по двум полям и хочу получить результирующую с таким же количеством строк.
Зачем получать точно такую же таблицу соединением, если она уже есть?
5. ink 19.10.23 19:11 Сейчас в теме
(4) Это только в примере. В системе запрос сложнее (две таблицы с ценами на разные даты), но принцип тот же: если вид цен не задан (NULL), то идет задвоение.
7. Said-We 19.10.23 22:08 Сейчас в теме
(5) Рисуйте пример приближенный к реальности. Может и не нужно соединения городить....
Пока задача реальная не понятна. То что вы свяжите по NULL есть NULL может не решить задачу.
10. ink 20.10.23 15:12 Сейчас в теме
(7) Если упрощать тот запрос, который я использую, до одного проблемного места, то основной алгоритм таков: выбираем номенклатуру из справочника по условиям, соединяем левым соединением выбранную номенклатуру с видами цен и ценами из регистра ЦеныНоменклатуры на одну дату и на другую дату. Сравниваем цены на разные даты.

И всё работает хорошо, но вдруг попадается позиция номенклатуры, которой никогда не задавалась цена: в регистре её нет и на разные даты вместо вида цен NULL. Получаем в результирующей таблице задвоение. Тут, в целом, доступно объяснили, что так и должно быть. Спасибо вам за желание разобраться и желание помочь.
9. gybson 20.10.23 09:45 Сейчас в теме
(5) Он наверное пустая ссылка все-же, если брать реквизит регистра, а не ссылку и присоединенного справочника.
8. Oldsad 20.10.23 02:03 Сейчас в теме
Если вам необходимо сделать соединение по NULL можно преобразовать в Неопределено,
понятно, что это не одно то же, но по крайней не нужно будет никаких дополнительных условий и проверок
11. ink 20.10.23 15:14 Сейчас в теме
(8) Да, всё верно. Или в пустую ссылку. Спасибо вам за желание разобраться и желание помочь.
12. Said-We 20.10.23 15:54 Сейчас в теме
(10) Можно вообще без соединения.... Если я правильно условие задачи услышал...
Оставьте свое сообщение

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