我可以通过执行 myrecord::text 将记录转换为字符串。我的问题是我的记录具有包含逗号的文本字段,并且生成的类型转换文本以逗号分隔。因此,我无法以良好的方式分离生成的文本。
解决方案是将记录转换为文本时定义自定义分隔符(例如制表符或分号)。我怎样才能实现这个目标?
谷歌搜索给了我答案,比如使用函数 string_agg、unnest、array_to_string 等。我的安装中不存在这些函数(我在 Windows 机器上使用 PostgreSQL 版本 12.4)。
replace(myrecord::text, ',', ' ') 将制表符放入应包含逗号的文本字段中。
示例代码:
DECLARE
myrecord RECORD;
BEGIN
FOR myrecord IN
SELECT * FROM mytable
LOOP
RAISE INFO '%',replace(myrecord::text, ',', '\t');
END LOOP;
END;
如果您需要表格内容的制表符分隔输出,您可以使用
COPY
:
COPY mytable TO '/dir/outfile' (FORMAT 'csv', DELIMITER E'\t');
我认为,@LaurenzAlbe 给出的答案完全满足您的任务。
为了感兴趣,我将提供另一个无需中间表即可直接转换复制的示例。
另请参阅此
COPY (select string_agg(value,';' order by ordinality)
from
(select test_table.id,t.*
from test, lateral jsonb_each_text(to_jsonb(test_table)) with ordinality as t
where ....
)x
group by id
order by id)
TO '/dir/outfile' (FORMAT 'csv', DELIMITER E'\t');;