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

Quote strings and dates in psql query results output

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 实现吗?

p.s。我知道这种事情可以用 SQL 像 DBeaver 这样的客户端来完成,但这不在这个问题的范围内。

要生成 CSV 输出,您可以使用 copy command 而不是尝试调整常规 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 (...);