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

Postgres, set value in jsonb structure to a return type of a function

我有一个 table 客户,其 DATA 列的类型为 jsonb,其中数据如下所示

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

我需要更新所有行中的数据,以便可以预测姓氏的值。

例如假设我有一个带有字符串或 jsonb 对象的函数 scramble(..),我该如何编写一个使用该函数来完成此操作的 UPDATE 语句?也就是说,对于每一行,我想用 scramble(DATA -> 'ADDRESS' -> 'surname')[=21 的 return 值替换姓氏的值=].

我知道 jsonb_set,但我见过的所有示例都明确设置了新值,而不是使用函数。

它应该是这样的:

update customer
   set data = jsonb_set(
                data, 
                '{ADDRESS,surname}',
                to_jsonb(scramble(data->'ADDRESS'->>'surname')::text)
              );

将 return 从 scramble() 转换为 text 可能是不必要的。

此查询可能是您要查找的内容:

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