我有一个数据表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"

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

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

但我在"from"(第二个"from")的位置或附近遇到了语法错误.

我还试着go 掉括号外的别名,以影响第一个‘SELECT’.到目前为止,没有一件事是成功的.

当我这样做时,我可以访问列中包含的信息并提取单个值或计数:

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

结果是‘2’,这是预期的.

如何获取json列中包含的值的列表?

推荐答案

这可以使用json_array_elements(如果数据类型为jsonb,则使用jsonb_array_elements)将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

Sql相关问答推荐

表名数组

SQL查询组类值在同一行中,并连接和排序其他值

Oracle SQL-将结果列在单行中

重新组合已排序的日期范围

获得第三名或最老的记录

每年独特口味的冰淇淋数量

根据最大值为字母数字大小写分配数值

用于从第二个表中提取具有最小最终价格值的记录的SQL查询

如何使用不重复的单个顶级字段(列)向json数组 Select 多行

提取连续时间戳范围的SQL

用替代方案替换 SQL Cursor 以提高性能

Spark / Hive:如何获取列中正值的百分比?

使用长 IN 子句的 SQL 优化

计算 BigQuery 中列的中值差 - 分析函数不能作为聚合函数的参数

多行状态下的分组查询判断状态

如何显示最常引用条目的详细信息

插入行时的行安全策略问题

如何在 SQL Server 中将 -13422.8450 舍入到 -13422.84

根据条件列出不同的值

在时态表和非时态表之间使用 EXCEPT 的 SQL 子查询给出表达式错误数