Postgres,将jsonb结构中的值设置为函数的返回类型

时间:2020-09-18 15:14:40

标签: sql postgresql jsonb

我有一个表CUSTOMER,表的列DATA为jsonb类型,

{
  "ADDRESS": {
    "city": "Berlin",
    "surname": "BRANDT",
    "firstName": "ANA"
  }
}

我需要更新所有行中的DATA,以使姓氏的值可预测地被加扰。

例如说我有一个带字符串或jsonb对象的函数scramble(..),如何编写使用该函数完成此操作的UPDATE语句?也就是说,对于每一行,我要用 scramble(DATA->'ADDRESS'->'surname')的返回值替换surname的值。

我了解jsonb_set,但是我看过的所有示例都显式设置了新值,而不是使用函数。

2 个答案:

答案 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()函数。

相关问题