首页 > 解决方案 > Postgres拆分并将字符串值转换为复合数组

问题描述

我有一个具有以下结构的类型。

create type t_attr as (id character varying(50), data character varying(100));

我通过用户定义的函数获取 text/varchar 值。该值如下所示。

txt := 'id1#data1' , 'id2#data2';

(在上面的示例中,有 2 个值用逗号分隔,但计数会有所不同)。

我正在尝试使用以下代码将每个集合存储到 t_attr 数组中。由于每个集合都将包含一个#分隔符,因此我使用它来拆分 id 和 data 值。出于测试目的,我只使用了以下一组

DO
$$
DECLARE
  attr_array t_attr[];
  txt text := 'id1#data1';
BEGIN
  attr_array[1] := regexp_split_to_array(txt, '#');
END;
$$
LANGUAGE plpgsql;

但是上面的代码抛出错误说'malformed record literal'and 'missing left paranthesis'。有人可以帮忙解决如何将这些数据存储到数组中吗?谢谢。

标签: postgresql

解决方案


这是因为您试图为记录分配一个数组值。尝试:

do $$
declare
    attr_array t_attr[];
    txt text := 'id1#data1';
begin
    attr_array[1] := (split_part(txt, '#', 1), split_part(txt, '#', 2));
    raise info '%', attr_array;
end $$;

输出:

INFO:  {"(id1,data1)"}
DO

但是,如果您确实需要使用数组拆分值:

do $$
declare
    a text[];
begin
    ....
    a := regexp_split_to_array(txt, '#');
    attr_array[1] := (a[1], a[2]);
end $$;

推荐阅读