我在Postgres(版本12.12)中定义了以下表格:
Table "public.test"
Column | Type | Collation | Nullable | Default
-----------+-------+-----------+----------+---------
uuid | uuid | | |
name | text | | |
json_data | jsonb | | |
字符串
下面是一个示例行:
uuid | name | json
12345678-3ffd-472b-ac39-31eacc4a6785 | foo | {"id": 1132}
型
我想使用同一个表中不同列的值更新json_data。类似这样:
UPDATE test SET json_data = json_data || '{"xyz":{"enabled": false, "uuid": test.uuid}}';
型
其中uuid的值是来自同一行的“uuid”值。因此,我希望所需的更新行看起来像这样:
uuid | name | json
12345678-3ffd-472b-ac39-31eacc4a6785 | foo | {"id": 1132, "xyz":{"enabled": false, "uuid": "12345678-3ffd-472b-ac39-31eacc4a6785"}}
型
尝试了这个,但得到了一个语法错误:
UPDATE test SET json_data = json_data || '{"xyz":{"enabled": false, "uuid": test.uuid}}';
ERROR: invalid input syntax for type json
LINE 1: update test set json_data = json_data || '{"xyz":{"e...
^
DETAIL: Token "test" is invalid.
CONTEXT: JSON data, line 1: {"xyz":{"enabled": false, "uuid": test...
型
2条答案
按热度按时间j2cgzkjk1#
你不能把一个像
test.uuid
这样的SQL表达式放在一个文本中,然后期望它被计算,你可以使用字符串插值和类型转换,但是那很难看,很容易搞砸。相反,使用
jsonb_build_object
函数构建json(b)值:字符串
或者,您可以使用
jsonb_set
而不是串联:型
但是这是相当丑陋的,我只建议在设置单个属性时使用它。
y53ybaqx2#
因为你使用的是json而不是jsonb,所以你需要一点强制转换来使用json-functions来更新json内容:
字符串
现在你不需要任何文本函数,当你在某个列中有一些NULL时,你是安全的。
NULL||“一些内容”
结果为NULL