【发布时间】:2021-11-28 17:29:59
【问题描述】:
我正在尝试在删除不同表中的值后更新表。
这是我对这个问题的简化函数查询:
create function updateoutfit(_id uuid, _title text DEFAULT NULL::text, _garments json)
returns TABLE(id uuid, title text, garments json)
language sql
as
$$
WITH del AS (DELETE FROM outfit_garment WHERE outfit_garment.outfit_id = _id RETURNING outfit_id),
updateOutfit AS (
UPDATE outfit SET
title = _title
FROM del
WHERE outfit.id = _id
RETURNING id, title
),
saveOutfitGarment as (
insert into outfit_garment (position_x, outfit_id)
SELECT "positionX",
(SELECT updateOutfit.id from updateOutfit)
from json_to_recordset(_garments) as x("positionX" float,
outfit_id uuid) RETURNING json_build_object('positionX', position_x) as garments)
SELECT id,
title,
json_agg(garments)
from updateOutfit as outfit,
saveOutfitGarment as garments
group by id, title;
$$;
如果有delete返回的outfit_id就好了:
DELETE FROM outfit_garment WHERE outfit_garment.outfit_id = _id RETURNING outfit_id
但如果没有要删除的行则失败。我尝试过这样的事情:
DELETE FROM outfit_garment WHERE outfit_garment.outfit_id = '1234' RETURNING (SELECT '1234' as outfit_id );
但它仍然返回 0 行。
有没有办法解决这个问题或更好的方法?
我正在使用 Postgres 13.2
【问题讨论】:
-
当然看起来
del是一个uuid,但您的UPDATE outfit指的是FROM del,这让我感到困惑。但我对 Postgres 还不流利。无论如何,是否可以使用if exists(...包装所有内容并以不同方式处理? -
您为
_garments中的每个"positionX"传递一个outfit_id UUID。但是然后你把它们扔掉并使用你传递给函数的_id uuid代替(在通过 CTEupdateOutfit中的UPDATE传递它之后。这是预期的吗?如果条件是,查询中的“条件”是什么不是第一个DELETE找到一行?
标签: sql json postgresql common-table-expression