【问题标题】:Quote strings and dates in psql query results output在 psql 查询结果输出中引用字符串和日期
【发布时间】:2020-05-06 10:51:20
【问题描述】:

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 客户端来完成,但这不在这个问题的范围内。

【问题讨论】:

标签: postgresql psql postgresql-11


【解决方案1】:

要生成 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 (...);

【讨论】:

  • 为不得不使用force_quote 感到羞耻,不是吗?引用字符和日期字段而不是其他字段似乎是一个相当常见的用例。无论如何,这显然是 +1 的正确方法。
猜你喜欢
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 2014-01-06
  • 2020-06-08
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多