我有一个表CUSTOMER,表的列DATA为jsonb类型,
{
"ADDRESS": {
"city": "Berlin",
"surname": "BRANDT",
"firstName": "ANA"
}
}
我需要更新所有行中的DATA,以使姓氏的值可预测地被加扰。
例如说我有一个带字符串或jsonb对象的函数scramble(..),如何编写使用该函数完成此操作的UPDATE语句?也就是说,对于每一行,我要用 scramble(DATA->'ADDRESS'->'surname')的返回值替换surname的值。
我了解jsonb_set,但是我看过的所有示例都显式设置了新值,而不是使用函数。
答案 0 :(得分:1)
它将遵循以下原则:
update customer
set data = jsonb_set(
data,
'{ADDRESS,surname}',
to_jsonb(scramble(data->'ADDRESS'->>'surname')::text)
);
可能不需要将scramble()
返回text
。
答案 1 :(得分:1)
此查询可能是您要查找的内容
WITH customer(data) AS (
VALUES ('{
"ADDRESS": {
"city": "Berlin",
"surname": "BRANDT",
"firstName": "ANA"
}
}'::jsonb)
)
SELECT
jsonb_set(data,'{ADDRESS,surname}',
to_jsonb(lower(data->'ADDRESS'->>'surname')))
FROM customer;
jsonb_set
--------------------------------------------------------------------------
{"ADDRESS": {"city": "Berlin", "surname": "brandt", "firstName": "ANA"}}
(1 Zeile)
注意:lower()
功能只是为了给您一个想法。将其替换为scrumble()
函数。