如何在冲突更新中使用CTE中的值 我有一个具有2列_key(String)和Data(JSON)的表,我正在尝试将数据升级到表格并获取错误:从表“更新”错误输出的“删除”输入“错误”错误i .. .

问题描述 投票:0回答:1
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),以及使用特殊
sql postgresql
1个回答
0
投票
表插入的行访问现有行的

SETWHERE

子句。
但在您的情况下,您可以通过分解
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<>小提琴

	
© www.soinside.com 2019 - 2025. All rights reserved.