【问题标题】:Accessing JSONB element by a variable path通过可变路径访问 JSONB 元素
【发布时间】:2019-10-01 23:07:03
【问题描述】:

我需要将两个 json 值合二为一。 但是这些变量的位置是动态的,我从数据库中获取 jsonb 中的位置。

所以我希望能够做这样的事情:

select '{"a": {"b": {"c": "d"}}}'::jsonb #> '{"a","b","c"}';

但我无法让它与变量一起使用,因为我不知道将路径投射到什么。

select '{"a": {"b": {"c": "d"}}}'::jsonb #> ('{"a","' || variable_from_database || '","c"}')::dataTypeOfJsonbPath;

我还发现我可以使用这样的查询:

select value#>>'{"c"}' from jsonb_each(('{"a": {"b": {"c": "d"}}}'::jsonb#>'{"a"}')) where key = 'b';

这将解决获取值的问题,但现在我需要将它们连接到原始 jsonb 值中,我目前不知道如何完成。

jsonb_set('{"a": {"b": {"c": "d"}}}'::jsonb, ('{"a","' || value2FromDatabase || '", "c"}'),
                                          (value1 || value2)::jsonb, false);

由于同样的原因,上述失败。

列出 jsonb_set 所需的参数告诉我第二个参数应该是 ARRAY 类型,但我不知道如何将该字符串转换为一个数组以使其工作。

谁能指出我正确的方向,即如何在 jsonb 对象中将一个值附加到另一个值,其中两者的键都在动态位置上?

【问题讨论】:

    标签: postgresql concat jsonb


    【解决方案1】:

    将路径转换为text[]

    demo:db<>fiddle

    SELECT
        '{"a": {"b": {"c": "d"}}}'::jsonb #> ('{"a","' || path || '","c"}')::text[]
    FROM 
        mytable
    

    【讨论】:

    • 我相信你是[postgresql]+[json(b)]组合最杰出的专家:) +1
    【解决方案2】:
    select '{"a": {"b": {"c": "d"}}}'::jsonb #>> ('{"a","'||'b'||'","c"}')::text[];
    

    这行得通,所以我需要转换为 text[]。 这行得通!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2017-05-17
      • 2017-01-14
      • 2020-11-10
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多