Строки цитат и даты в выводе результатов запроса psql - PullRequest
0 голосов
/ 06 мая 2020

В разделе \ pset [option [value]] документов psql, я могу установить различные настройки, чтобы сделать результаты моего запроса удобными для меня.

Я могу, например, подойдите к выводу, подобному 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?

ps Я знаю, что такие вещи можно делать с SQL клиентами, такими как DBeaver, но это не так в рамках этого вопроса.

1 Ответ

2 голосов
/ 06 мая 2020

Чтобы сгенерировать вывод 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 (...);
...