从 Postgres 中的 JSONB 中提取多个值

Extract multiple values from JSONB in Postgres

我有一个 table 看起来像这样:

id attrs
1 {"a":{"kind":"kind_1", "value":"val_1"}, "b":{"kind":"kind_2", "value":"val_2"}
2 {"c":{"kind":"kind_3", "value":"val_1"}}
3 {"a":{"kind":"kind_1", "value":"val_1"}, "d":{"kind":"kind_4", "value":"val_4"}, .....

我想提取所有唯一的 value,所以输出将是:

val_1
val_2
val_4
...

我尝试使用 jsonb_each 方法,但没有成功

您可以使用 JSON 路径查询:

select distinct v.item #>> '{}'
from the_table t
  cross join jsonb_array_elements(jsonb_path_query_array(t.attrs, '$.**.value')) as v(item);

v.item #>> '{}' 是将标量 JSON 值转换为 text 的技巧(因为强制转换不起作用)

或者您可以使用 jsonb_each() 两次:

select distinct v.value
from the_table t
  cross join jsonb_each(t.attrs) as i(key, item)
  cross join jsonb_each_text(i.item) as v(key, value)
where v.key = 'value'