【问题标题】:Array in Array Handling in PosgresQLPostgresQL 中的数组处理中的数组
【发布时间】:2018-09-08 11:48:24
【问题描述】:

我已根据以下查询从 PostgresQL 10.5 的 JsonB 数据类型中提取数组。它提供数组数据,但作为文本(参见列标题)。

具有 JSONB 列的父数据表

从 JSONB 列中提取数组文本的代码

SELECT "Path" -> 'points' ->> 'coordinates' AS ca from public."Route"

参考下面的快照,它在输出中给出了文本列

我需要以这样一种方式处理这个表,我可以通过 SQL 调用 x 和 y 坐标(数组 [[x1,y1],[x2,y2],...]

【问题讨论】:

  • 您的第一个输出是 not “数组” - 它是一个带有键/值对的 JSON 值。您应该发布formatted text 以获取示例数据,而不是让内容更易于阅读的屏幕截图。

标签: sql arrays json postgresql


【解决方案1】:

您可以使用子查询,其中 JSON 数组被转换为使用 jsonb_array_elements_text() 设置,然后聚合到带有 array_agg() 的数组并沿途进行转换。

SELECT (SELECT array_agg(jae.e::decimal)
               FROM jsonb_array_elements_text("Path"->'points'->'coordinates') jae(e)) points
FROM "Route";

【讨论】:

  • 错误:数字类型的输入语法无效:“[73.21876, 22.355220000000003]” SQL 状态:22P02
  • 数据结构为十进制转数组转数组[[decimal,decimal],[decimal,decimal],...]
  • text 替换 decimal 给了我输出 array-as-string 但我需要 array-of-decimals SELECT (SELECT array_agg(jae.e::text) FROM jsonb_array_elements_text("Path"->'points'->'coordinates') jae(e)) points FROM "Route";
  • 解决方案:sourceSELECT array_agg(t) FROM ( SELECT REPLACE(REPLACE(REPLACE(UNNEST(a), '[', ''), ']', ''),' ','')::decimal AS t, ROW_NUMBER() OVER (ORDER BY 1) AS r FROM ( SELECT STRING_TO_ARRAY(jsonb_array_elements_text("Path"->'points'->'coordinates'), ',') a FROM "Route" ) t ) t Group by r order by r;
【解决方案2】:

感谢@Sticky bit 的指导……我通过Blog 得到了完整的解决方案

SELECT array_agg(t) 
FROM ( 
       SELECT REPLACE(REPLACE(REPLACE(UNNEST(a), '[', ''), ']', ''),' ','')::decimal AS t, ROW_NUMBER() OVER (ORDER BY 1) AS r 
       FROM ( 
              SELECT STRING_TO_ARRAY(jsonb_array_elements_text("Path"->'points'->'coordinates'), ',') a 
              FROM "Route" 
            ) t 
      ) t 
Group by r 
order by r;

【讨论】:

    猜你喜欢
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多