在psql查询结果输出中引用字符串和日期



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 stdoutpsql的同级copy更易于使用,因为它允许多行查询。

要将所有内容写入文件,可以使用psql中的o命令

postgres=> o data.csv
postgres=> copy (...) to stdout with (...);

最新更新