PostgreSQL从jsonb对象获取任何值
我想获取键“a”或“b”的值(如果其中一个存在)。如果两者都不存在,我需要映射中任何键的值 例如:PostgreSQL从jsonb对象获取任何值,sql,postgresql,jsonb,postgresql-9.6,Sql,Postgresql,Jsonb,Postgresql 9.6,我想获取键“a”或“b”的值(如果其中一个存在)。如果两者都不存在,我需要映射中任何键的值 例如: “{a:“aaa”,“b:“bbbb”,“c:“cccc”}”应返回aaa '{“b”:“bbbb”,“c”:“cccc”}'应返回bbb '{“c”:“cccc”}应返回cccc 目前我是这样做的: 从…中选择合并(o->a',o->b',o->c') 问题是我并不想显式地命名键“c”,因为有些对象可以有任何键 那么,我如何实现“获取‘a’或‘b’的值(如果两者都存在)。如果两者都不存在,则
应返回“{a:“aaa”,“b:“bbbb”,“c:“cccc”}”
aaa
应返回'{“b”:“bbbb”,“c”:“cccc”}'
bbb
应返回'{“c”:“cccc”}
cccc
从…中选择合并(o->a',o->b',o->c')
问题是我并不想显式地命名键“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)
想法是
jsonb_object_key
并获取第一个“random”(因为我不按任何顺序)(limit 1
),然后将其用于最后一个合并
不变量谢谢。我找不到任何方法来做这件事。对于当前的用例,这有点多,但现在我知道有一种方法可以做到这一点。我的第一个想法是一个简单的o->>0
,就像你对数组所做的那样,但那不是。。。