2011-06-29 41 views

回答

72

如果您在使用PostgreSQL 8.2或更新版本,用這個CSV:

psql -c "COPY (<select query>) TO STDOUT WITH CSV" 

這TSV的,在適當的空值:

psql -c "COPY (<select query>) TO STDOUT WITH NULL AS ''" 

CSV格式將正確引用包含雙引號字符的任何字段。有關COPY的更多詳細信息和選項,請參閱特定版本的PostgreSQL文檔。

+5

我愛Postgres! – dan

+7

它確實使這件事容易,不是嗎?設想一些「大數據庫供應商」的答案......首先安裝這個64 Meg軟件包,然後運行這個導出工具,它具有可能想象的最神祕的語法。使用時請注意不要刪除整個數據庫。:) –

5

編輯:通過-F使用-F

使用逗號,並使用「未對齊的表輸出模式」 -A

psql my_database -U myuser -A -F , -c "select * from mytable" 
+2

如果您的分隔符出現在列的值中,則會出現問題。 – Red15

+0

-F要求-A工作,請記住 – albfan

+0

@ Red15,如果你的分隔符出現在列的值中,你將如何解決這個問題? –

3

您可以指定使用-F命令行參數字段分隔符給psql

3

也有可能是copy命令,它允許你指定報頭,分隔符和引用選項

psql my_database -U my_user -c "copy (select a.id,b.id from my_table_a as a inner join my_table_b as b on b.id = a.id) to STDOUT" 
30

來自波希米亞的回答開始,我發現這些標誌有用:

psql my_database -U myuser -A -F , -X -t -f /path/to/query.sql -o /path/to/output.csv 
  • 未對齊輸出模式:-A
  • 使用逗號作爲字段分隔符:-F,
  • 不要讀psqlrc:-X
  • 元組(不使用頁眉/頁腳):-t
  • 文件包含SQL查詢:-f
  • 輸出文件:-o
+2

如果您輸出的文本字段中包含逗號,它將會*不*如您所期望的那樣工作。 –

3

要指定TSV使用分隔符 '\ T'

psql my_database -U myuser -F'\t' --no-align -f mysqlfile.sql -o outputfile.tsv 

要指定CSV使用分隔符 ''

psql my_database -U myuser -F',' --no-align -f mysqlfile.sql -o outputfile.csv