从Postgresql中包含JSON值的列中提取列表或目录

jmo0nnb3  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(45)

我有一个数据表my_table,如下所示

| id | column1 | data       |
|----+---------+------------|
| 1  | value_1 | ["A", "B"] |
| 2  | value_2 | ["B", "C"] |
| 3  | value_3 | ["A", "C"] |
| 4  | value_4 | ["E", "B"] |

字符串
我需要提取列data中所有唯一JSON字符串的列表,例如

"A"
"B"
"C"
"D"
"E"


我尝试了Postgresql文档中的一些json函数,比如:

select * from json_each_text(select data from my_table as foo)


但我在“from”(第二个“from”)处或附近出现语法错误。
我也试过去掉括号外的别名来影响第一个“选择”,但到目前为止还没有成功。
我可以访问列中包含的信息,并在执行以下操作时提取单个值或计数:

select count(*) from my_table
  where data::jsonb ? 'A' = true;


结果是“2”,这是预期的结果。
如何获取json列中包含的值的列表?

iqih9akk

iqih9akk1#

这可以使用json_array_elements(或者jsonb_array_elements,如果数据类型是jsonb)将json(b)数组转换为行:

select distinct t.value::text
from my_table
cross join json_array_elements(data) t

字符串
对于这个简单的数据:

create table my_table (
  id int,
  column1 varchar(20),
  data json
);

insert into my_table values
(1,  'value_1',  '["A", "B"]'),
(2,  'value_2',  '["B", "C"]'),
(3,  'value_3',  '["A", "C"]'),
(4,  'value_4',  '["E", "B"]');


结果如下:

value
"A"
"C"
"B"
"E"


Demo here

相关问题