postgresql - 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'
。有人可以帮忙解决如何将这些数据存储到数组中吗?谢谢。
解决方案
这是因为您试图为记录分配一个数组值。尝试:
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 $$;
推荐阅读
- ruby-on-rails - 关于将家庭成员添加到帐户的 Rails 数据库建议
- python - 如何在 python 中创建一组参数化函数?
- git - BFG Repo Cleaner 无法清除远程中的 git 历史记录
- c++ - 我可以使用“using”而不是“typedef”作为指向类成员变量的指针吗?
- c# - 根据列值删除excel行C#
- asp.net-core - ASP.NET Core 3.1: authentication through Active Directory on linux
- git - Solution for multiple people working on one file GIT
- git - Git - 更新本地分支
- java - 迭代次数非常有限的 ConcurrentModificationException
- javascript - JavaScript 数组从数字到字符排序