我正在try 编写一个postgres函数,该函数接受一个数组数组(例如[[65.8434183140001,38.905535066],[65.8433595220001,38.905479615],[65.843286031,38.9054103],[65.843108611,38.9055251450001],[65.8432114970001,38.905622185],[65.8434183140001,38.905535066]]),并将所有值连接成一个字符串,该字符串将用作postgis LINESTRING的输入.

该函数的期望输出为:65.8434183140001 38.905535066, 65.8433595220001 38.905479615, 65.843286031 38.9054103, 65.843108611 38.9055251450001, 65.8432114970001 38.905622185, 65.8434183140001 38.905535066

在阅读了许多关于so的答案和阅读了许多文章后,我得出了以下结论(我对postgres函数和过程还不熟悉):

create or replace 
function flatten_points (points text[])
  returns text
  language sql 
  immutable 
as $func$
  DECLARE 
    flattened varchar[];
    p text[];
  BEGIN
    FOREACH p SLICE 1 IN ARRAY points
      LOOP
        RAISE NOTICE 'CONCAT(flattened, %,%)', m[1], m[2];
      END LOOP;
  END
  
  RETURN flattened
$func$;

不幸的是,这个函数甚至没有被创建,并且postgres出现语法错误.我不确定我做错了什么.

我怎么才能写出我想要的函数.欢迎您提供任何答案或建议.

附注:如果有一种方法可以使用POSTGIS从数组直接创建面,那将是非常棒的

推荐答案

您可以使用string_agg:

create or replace function flatten_points (points numeric[][]) returns text
as $$
    select string_agg((select string_agg(p::text, ' ') 
       from jsonb_array_elements(a) p), ', '::text) 
    from jsonb_array_elements(array_to_json(points)::jsonb) a
$$ language sql

用途:

select flatten_points(array[array[65.8434183140001,38.905535066],array[65.8433595220001,38.905479615], array[65.843286031,38.9054103],array[65.843108611,38.9055251450001],array[65.8432114970001,38.905622185],array[65.8434183140001,38.905535066]])

See fiddle

Sql相关问答推荐

如何在联接条件不匹配时按日期获取上一条记录

Stack Exchange站点上的最短帖子(按正文长度计算,用户名为原始发帖(SEDE))

使用多个嵌套数组查询JSON数据

SQL到Snowflake-转换嵌套的SELECT(值

在WHERE EXISTS子查询中,列返回是否重要?

如何在多列上编写具有不同条件的查询?

如何使用聚合连接两个表

如何在T-SQL中编写row_number的WHERE子句?

SQL中相同表内的VLOOKUP等价

我需要在 ASP.NET C# 中获取 2 个 SQL 查询结果的平均值

具有多个表 JOINS 的 STRING_AGG 的替代方法 (SQL Server 2016)

列(值不为空)到其他有序列

如何将输出转换为二维格式?

在给定的日期范围内填写缺失的日期

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

使用in和and运算符过滤记录的条件

获取 SQL Server 中每一行的两个-之间的文本

在 SQL 中使用循环遍历按时间顺序排列的数据

过滤具有一对多关系的两个表之间的数据

使用标准SQL 触发更新当前日期