LINUX.ORG.RU

Написать странный запрос с update

 ,


0

1

Использую PGSQL, упрощенный запрос выглядит так

 
WITH a
         AS ( SELECT DISTINCT UNNEST(ARRAY['777', NULL]) "Ключ",
         UNNEST(ARRAY['111', '222']) "Знач"
         )
 update "Документы"
 set "Название" = "Название" || '_' || a."Знач"
 FROM a
 where "Id" IS NOT DISTINCT FROM  a."Ключ"
returning *
хочется переписать запрос для того чтобы попадать в индекс, отдельно для нулевых значений и не нулевых, такого типа
 
WITH a
         AS ( SELECT DISTINCT UNNEST(ARRAY['777', NULL]) "Ключ",
         UNNEST(ARRAY['333', '444']) "Знач"
         )
 update "Документы"
 set "Название" = "Название" || '_' || a."Знач"
 FROM a
 where
   EXISTS (
    SELECT TRUE
    FROM a
    WHERE "Id" = a."Ключ" and "Id" IS NOT NULL and a."Ключ" IS NOT NULL  
    UNION
     SELECT TRUE
    FROM a
    WHERE "Id" IS NULL and a."Ключ" IS NULL
   )
returning *
этот запрос неверно определяет Знач, для своего Ключа. Как написать подобный запрос, если не прибегать к CTE?

UPDATE "Документы" d
SET "Название" = d."Название" || '_' || a."Знач"
FROM (
	SELECT DISTINCT 
		UNNEST(ARRAY['777', NULL]) "Ключ", UNNEST(ARRAY['333', '444']) "Знач"
) a
WHERE
	(d."Id" = a."Ключ")
	OR
	(d."Id" IS NULL AND a."Ключ" IS NULL)
RETURNING *
;

такое должно попадать в индекс по d.«Id»

Toxo2 ★★★★
()
Последнее исправление: Toxo2 (всего исправлений: 1)
Ответ на: комментарий от anonymous

IS NOT DISTINCT FROM

это не попадёт в индексы.
так уж оно устроено.

С SQL вообще часто надо очень осторожно смотреть на «красоту кода». С виду какая-то дурацкая конструкция - иной раз единственный путь построить красивый план запроса.

Toxo2 ★★★★
()
Последнее исправление: Toxo2 (всего исправлений: 1)