Чтобы сгенерировать вывод 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
sibling \copy
, потому что он позволяет выполнять многострочные запросы.
Чтобы записать все в файл, вы можете использовать команду \o
в psql
postgres=> \o data.csv
postgres=> copy (...) to stdout with (...);