Строки кавычек и даты в выводе результатов запроса psql

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

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


person LondonRob    schedule 06.05.2020    source источник
comment
Найдите этот stackoverflow.com/questions/22078456/   -  person kofemann    schedule 06.05.2020


Ответы (1)


Чтобы создать вывод в формате 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 одноуровневый \copy, потому что он позволяет выполнять многострочные запросы.

Чтобы записать все в файл, вы можете использовать команду \o в psql

postgres=> \o data.csv
postgres=> copy (...) to stdout with (...);
person a_horse_with_no_name    schedule 06.05.2020
comment
Стыдно использовать force_quote, не так ли? Похоже, что это довольно распространенный вариант использования для цитирования полей символов и дат, а не других. Несмотря на это, это явно правильный способ сделать это +1. - person LondonRob; 11.05.2020