函数string_to_array在没有用撇号分组子字符串的情况下拆分字符串:
# select unnest(string_to_array('one, "two,three"', ','));
unnest
--------
one
"two
three"
(3 rows)
我希望有一个更聪明的功能,如:
# select unnest(smarter_string_to_array('one, "two,three"', ','));
unnest
--------
one
two,three
(2 rows)
目的。
我知道COPY
命令以正确的方式执行,但我在内部需要此功能。
我想解析现有表行的文本表示。例如:
# select * from dataset limit 2;
id | name | state
----+-----------------+--------
1 | Smith, Reginald | Canada
2 | Jones, Susan |
(2 rows)
# select dataset::text from dataset limit 2;
dataset
------------------------------
(1,"Smith, Reginald",Canada)
(2,"Jones, Susan","")
(2 rows)
我想在不同的表的plpgsql函数中动态地执行它。我不能假设表的列数不变,也不能假设列值的格式。
答案 0 :(得分:1)
有一种很好的方法可以将整个表转换为单列表:
select (json_each_text(row_to_json(t))).value from dataset t;
如果列ID是唯一的,那么
select id, array_agg(value) arr from (
select row_number() over() rn, id, value from (
select id, (json_each_text(row_to_json(t))).value from dataset t
) alias
order by id, rn
) alias
group by id;
完全满足您的需求。使用row_number()的附加查询是保持列的原始顺序所必需的。