data(json)
的表,如果我删除DO UPDATE SET并将其替换为无需do do do note do note do note note,我正试图将数据上升到表中,并删除错误。我还尝试在更新部分中使用
error: missing FROM-clause entry for table "updates"
&EXLCLUDED.field
,但这导致了EXCLUDED.value
我要修复的查询是我要修复的查询,如果有冲突,查询应该更新JSON对象,以便将字段设置为OldValue +NewValue.。
error: column excluded.field does not exist
我有一个在下面的单个
WITH updates AS (
SELECT UNNEST($1::TEXT[]) AS _key,
UNNEST($2::TEXT[]) AS field,
UNNEST($3::NUMERIC[]) AS value
)
INSERT INTO "legacy_hash" ("_key", "data")
SELECT _key, jsonb_build_object(field, value) FROM updates
ON CONFLICT ("_key")
DO UPDATE SET "data" = jsonb_set(
"legacy_hash"."data",
ARRAY[updates.field],
to_jsonb(COALESCE(("legacy_hash"."data"->>updates.field)::NUMERIC, 0) + updates.value)
)
上工作的版本
(key, field, value)
不幸的是,您可以在
INSERT INTO "legacy_hash" ("_key", "data")
VALUES ($1::TEXT, jsonb_build_object($2::TEXT, $3::NUMERIC))
ON CONFLICT ("_key")
DO UPDATE SET "data" = jsonb_set(
"legacy_hash"."data",
ARRAY[$2::TEXT],
to_jsonb(COALESCE(("legacy_hash"."data"->>$2::TEXT)::NUMERIC, 0) + $3::NUMERIC)
)
子句中访问的唯一表是当前的行值(如表名称,或者是别名(如果有)),以及提出的但失败的行(如
ON CONFLICT DO
表)。
使用表的名称(或Alias),以及使用特殊SET
和WHERE
子句。
但在您的情况下,您可以通过分解
ON CONFLICT DO UPDATE
以使您的价值弄清楚,以更令人费解的方式重建所需的东西。您可以使用JSONPATH函数excluded
将对象的键和值作为JSONB数组。
jsonb
,而是使用keyvalue()
WITH updates AS ( SELECT UNNEST($1::TEXT[]) AS _key, UNNEST($2::TEXT[]) AS field, UNNEST($3::NUMERIC[]) AS value ) INSERT INTO legacy_hash (_key, data) SELECT _key, jsonb_build_object(field, value) FROM updates ON CONFLICT (_key) DO UPDATE SET data = jsonb_set( legacy_hash.data, ARRAY[jsonb_path_query_first(excluded.data, '$.keyvalue()[0]')->>'key'], to_jsonb( COALESCE((legacy_hash.data->>(jsonb_path_query_first(excluded.data, '$.keyvalue()[0]')->>'key'::text))::NUMERIC, 0) + (jsonb_path_query_first(excluded.data, '$.keyvalue()[0]')->>'value')::NUMERIC ) );
DB<>小提琴