PostgreSQL从jsonb对象

时间:2018-01-15 07:56:14

标签: sql postgresql jsonb postgresql-9.6

我希望得到任何一个键的价值' 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。

1 个答案:

答案 0 :(得分: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不变的