在psql
文档的\pset[option[value]]部分,我可以设置各种设置,以方便我的查询结果。
例如,我可以使用来处理类似CSV的输出
pset fieldsep ','
pset footer off
pset format unaligned
pset null 'NULL'
结果输出类似:
> WITH foo_tbl(foo,bar,baz)
> AS
> (
> VALUES
> ('foo', NULL, 1),
> (NULL, 'bar', 1)
> )
> SELECT * FROM foo_tbl;
foo,bar,baz
foo,NULL,1
NULL,bar,1
这很好,但我希望字符串和日期被引用,就像这样:
foo,bar,baz
'foo',NULL,1
NULL,'bar',1
这在psql中是不可能的吗?
附言:我知道这种事情可以用DBeaver这样的SQL客户端来完成,但这不在这个问题的范围内。
要生成CSV输出,可以使用copy
命令,而不是试图调整常规SELECT语句的输出。
copy (
WITH foo_tbl (foo,bar,baz,dt) AS
(
VALUES
('foo', NULL, 1, date '2020-01-02'),
(NULL, 'bar', 1, date '2020-03-04')
)
SELECT *
FROM foo_tbl
) to stdout
with (format csv, quote '''', header, null 'NULL', force_quote (foo, dt) );
将生成以下输出
foo,bar,baz,dt
'foo',NULL,1,'2020-01-02'
NULL,bar,1,'2020-03-04'
我不知道有哪个选项只引用日期和字符串,而不引用数字,所以使用force_quote
并指定要引用的列是获得它们的唯一方法(始终(。
copy (...) to stdout
比psql
的同级copy
更易于使用,因为它允许多行查询。
要将所有内容写入文件,可以使用psql中的o
命令
postgres=> o data.csv
postgres=> copy (...) to stdout with (...);