我想获取键“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。
最佳答案
可能太长了:
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
不变
关于sql - PostgreSQL 从 jsonb 对象中获取任何值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48258891/