我有这张桌子

create table <table_name>(attr jsonb)

这是里面的数据

{
  "rules": [
    {
      "id": "foo",
      "name": "test_01",
      ...
    },
    {
      "id": "bar",
      "name": "test_02",
      ...
    }
  ]
}

我想要的是 Select 这两个名字,到目前为止我已经完成的是

select attr -> 'rules' -> 0 -> 'name' from <table_name>;

返回test_01

select attr -> 'rules' -> 1 -> 'name' from <table_name>;

返回test_02

我想退回这样的东西:

test_01,test_02

或者如果可以多行返回,那就更好了

这是显示我的问题的示例数据,由于我无法控制的原因,不可能将每个规则存储在不同的行上

推荐答案

您可以使用jsonb_array_lengthgenerate_series来获得每个名称.然后使用string_agg聚合名称列表.没有plpgsql,只有一条语句.(见demo)

with jl(counter) as ( select jsonb_array_length(attr->'rules') from table_name ) 
   select string_agg(name,' ') "Rule Names" 
     from (select attr->'rules'-> n ->> 'name' name
             from table_name 
             cross join ( select generate_series(0,counter-1) from jl ) gs(n) 
          ) rn; 

Postgresql相关问答推荐

Postgs SQL用于比较两个表之间的数据并填充到目标中

为什么更新不设置较晚的结束时间?

Postgres:这是对OVERLAPS谓词的等效重写吗?

PostGresql :正则表达式 Select 其中只有一个正斜杠的行

如何在 postgres where 子句中使用 or 对条件进行组合或分组

如何准确确定边界附近的点和地理的 ST_Intersects(ST_Intersects geography vs. Geometry diffrepancy)

合并两个字典并创建一个包含更新凭据的字典列表

当参数大小超过 393166 个字符时,PSQL 准备语句查询挂起

订阅标签保存在哪个表中?

如何在 PostgreSQL hstore 中使用通配符查询值

断言错误:Django-rest-Framework

在远程机器上Restore dump

PostgreSQL:如何安装 plpythonu 扩展

Postgres 类似于 SQL Server 中的 CROSS APPLY

如何从另一个脚本运行 postgres sql 脚本?

获取 psycopg2 count(*) 结果数

获取json列键为空的记录

Postgres 数据库文件保存在 ubuntu 中的什么位置?

SQL 基本类型:integer vs int?

避免通过 JPA 将null值插入数据库表