在 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 stdout
比 psql
兄弟 \copy
更易于使用,因为它允许多行查询。
要将所有内容写入文件,可以在 psql
中使用 \o
命令
postgres=> \o data.csv
postgres=> copy (...) to stdout with (...);
在 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 stdout
比 psql
兄弟 \copy
更易于使用,因为它允许多行查询。
要将所有内容写入文件,可以在 psql
中使用\o
命令
postgres=> \o data.csv
postgres=> copy (...) to stdout with (...);