Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL从jsonb对象获取任何值_Sql_Postgresql_Jsonb_Postgresql 9.6 - Fatal编程技术网

PostgreSQL从jsonb对象获取任何值

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”或“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
,就像你对数组所做的那样,但那不是。。。