Postgresql 带点数的Postgres

Postgresql 带点数的Postgres,postgresql,postgis,plpgsql,unnest,Postgresql,Postgis,Plpgsql,Unnest,我正在尝试编写一个PL/PGSQL函数,该函数将分隔文本作为输入,并将行插入到包含点的表中。我有一个可以正常工作的测试函数: rowsaz := string_to_array(input,'?'); INSERT INTO test (num1, num2, my_name) SELECT * FROM unnest(string_to_array(rowsaz[1],',')::integer[],string_to_array(rowsaz[2],',')::integer[],strin

我正在尝试编写一个PL/PGSQL函数,该函数将分隔文本作为输入,并将行插入到包含点的表中。我有一个可以正常工作的测试函数:

rowsaz := string_to_array(input,'?');
INSERT INTO test (num1, num2, my_name)
SELECT * FROM unnest(string_to_array(rowsaz[1],',')::integer[],string_to_array(rowsaz[2],',')::integer[],string_to_array(rowsaz[3],',')::varchar[]);
return true;
所以如果你用

SELECT myfunction('1,2,3?4,5,6?a,b,c')
然后你会得到一张像这样的桌子

1   4   a
2   5   b
3   6   c
CREATE TABLE public.gps_points
(
    id integer NOT NULL DEFAULT nextval('gps_id_seq'::regclass),
    location geometry(Point,4326),
    created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP,
    user_id integer
)
但是当你有一张像这样的桌子时,你怎么做呢

1   4   a
2   5   b
3   6   c
CREATE TABLE public.gps_points
(
    id integer NOT NULL DEFAULT nextval('gps_id_seq'::regclass),
    location geometry(Point,4326),
    created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP,
    user_id integer
)
插入的内容看起来像 插入gps_点(位置、用户id)值(ST_GeomFromText('POINT(-71.060316 48.432044)),4326),2

但是对于unnest,这会变得很棘手,因为必须将坐标传递到ST_POINT函数中。然后我将使用以下命令调用该函数: 选择myfunction('36.98,36.99,36.97?45.85,45.86,45.87?1,2,3')

我正试着做下面的事情,但行不通

insert into gps_points( geom, user_id)
select unnest( (ST_GeomFromText('POINT(string_to_array(rowsaz[1],',')::double precision[] string_to_array(rowsaz[2],',')::double precision[])', 4326),string_to_array(rowsaz[3],',')::double precision[]));

有人帮我弄到了:

insert into gps_points( geom, user_id)
  select ST_SetSRID(ST_MakePoint(lng, lat), 4326), uid from unnest(string_to_array(rowsaz[1],',')::double precision[],string_to_array(rowsaz[2],',')::double precision[],string_to_array(rowsaz[3],',')::integer[]) as u(lng,lat,uid);