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