WITH a
AS ( SEL ECT DISTINCT UNNEST(ARRAY['777', NULL]) "Ключ",
UNNEST(ARRAY['111', '222']) "Знач"
)
upd ate "Документы"
set "Название" = "Название" || '_' || a."Знач"
FR OM a
where "Id" IS NOT DISTINCT FR OM a."Ключ"
returning *
Показать
хочется переписать запрос для того чтобы попадать в индекс,
отдельно для нулевых значений и не нулевых, такого типа
WITH a
AS ( SEL ECT DISTINCT UNNEST(ARRAY['777', NULL]) "Ключ",
UNNEST(ARRAY['333', '444']) "Знач"
)
update "Документы"
se t "Название" = "Название" || '_' || a."Знач"
FR OM a
wh ere
EXISTS (
SELECT TRUE
FR OM a
WH ERE "Id" = a."Ключ" and "Id" IS NOT NULL and a."Ключ" IS NOT NULL
UNI ON
SEL ECT TRUE
FR OM a
WH ERE "Id" IS NULL and a."Ключ" IS NULL
)
returning *
Показать
этот запрос неверно определяет Знач, для своего Ключа.
Как написать подобный запрос, если не прибегать к CTE?
(1)И сам апдейт у Вас странный. Обычно как-то так (на коленке писал - нет у меня Ваших таблиц):
UPD ATE t1
SE T t1."Название" = t1."Название" || '_' || t2."Знач"
FROM "Документы" as t1
inner join (SELECT DISTINCT
UNNEST(ARRAY['777', NULL]) "Ключ",
UNNEST(ARRAY['333', '444']) "Знач"
) AS t2
on t1."Id" = t2."Ключ" or (t1."Id" is null and t2."Ключ" is null)
Опять же SELECT DISTINCT в Вашем варианте допускает несколько одинаковых ключей с разными значениями - смотреть картинку. Нужно взять один из них.
https://onecompiler.com/postgresql/424jupj4w