sql - PostgreSQL 从 jsonb 对象中获取任何值

标签 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。

最佳答案

可能太长了:

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/

相关文章:

sql - 在事件的 myISAM 表上添加索引的最简单方法是什么?

postgresql - 将索引添加到 dbt 模型列?

sql - Postgresql,具有多个键的 jsonb 为每个键返回一行

postgresql - 如何使用 PostgreSQL JSONB_SET() 创建新的深层对象元素

sql - 如何在 Sybase Anywhere 11 中更改数据库用户名和数据库组名

mysql - 将 ORDER BY 添加到 LEFT OUTER JOIN

sql - PostgreSQL 查询按天计数/分组并显示没有数据的天数

java第二个sql语句不工作

postgresql - Insert 能否锁定选择/选择计数 (*) 或其他方式?

sql - 如何查询 JSONB 字段字典中的值数组?