【问题标题】:PostgreSQL get any value from jsonb objectPostgreSQL 从 jsonb 对象中获取任何值
【发布时间】:2018-06-23 20:12:32
【问题描述】:

如果任一键存在,我想获取键“a”或“b”的值。如果都不存在,我想要地图中任何键的值。

例子:

  • '{"a": "aaa", "b": "bbbb", "c": "cccc"}' 应该返回 aaa
  • '{"b": "bbbb", "c": "cccc"}' 应该返回 bbb
  • '{"c": "cccc"}' 应该返回 cccc

目前我正在这样做: SELECT COALESCE(o ->> 'a', o ->> 'b', o->> 'c') FROM...

问题是我真的不想明确命名键“c”,因为有些对象可以有任何键。

那么我如何实现“如果存在则获取'a'或'b'的值。如果都不存在,则抓取任何存在的东西。”的预期效果?

我正在使用 postgres 9.6。

【问题讨论】:

    标签: sql postgresql jsonb postgresql-9.6


    【解决方案1】:

    可能太长了:

    t=# with c(j) as (values('{"a": "aaa", "b": "bbbb", "c": "cccc"}'::jsonb))
    , m as (select j,jsonb_object_keys(j) k from c)
    , f as (select * from m where k not in ('a','b') limit 1)
    t-# select COALESCE(j ->> 'a', j ->> 'b', j->>k) from f;
     coalesce
    ----------
     aaa
    (1 row)
    

    并且没有 a,b 键:

    t=# with c(j) as (values('{"a1": "aaa", "b1": "bbbb", "c": "cccc"}'::jsonb))
    , m as (select j,jsonb_object_keys(j) k from c)
    , f as (select * from m where k not in ('a','b') limit 1)
    select COALESCE(j ->> 'a', j ->> 'b', j->>k) from f;
     coalesce
    ----------
     cccc
    (1 row)
    

    想法是 extract all keys with jsonb_object_keys 并获得第一个“随机”(因为我不按任何顺序订购)(limit 1),然后将其用于最后一个 coalesce 不变量

    【讨论】:

    • 谢谢你。我无法找到任何方法来做到这一点。对于当前的用例,这有点多,但现在我知道有办法做到这一点。我的第一个想法是一个简单的o ->> 0,就像你对数组所做的那样,但这不是......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2019-09-24
    • 2020-12-13
    • 2022-07-02
    • 2019-09-26
    • 2017-10-25
    相关资源
    最近更新 更多