在PostgreSQL中使用COPY TO



我在postgres中使用COPY TO在文件中写入选择语句的结果。这是我的代码:

    COPY (SELECT COALESCE(AG.AGOF_CODIGO, 0) ||E't'||
               cast('AGENDA' as varchar) ||E't'||
               regexp_replace(RTRIM(LTRIM(COALESCE(AG.AGOF_DESCRICAO, ' '))), E'[\n\r\u2028]+', ' ', 'g' ) ||E't'||
               regexp_replace(RTRIM(LTRIM(COALESCE(AG.AGOF_DESCRICAO, ' '))), E'[\n\r\u2028]+', ' ', 'g' ) ||E't'||
               COALESCE(TO_CHAR(AG.AGOF_DATAI, 'YYYY-MM-DD"T"HH24:MI:SSOF'), cast(' ' as varchar)) ||E't'||
               COALESCE(TO_CHAR(AG.AGOF_DATAF, 'YYYY-MM-DD"T"HH24:MI:SSOF'), cast(' ' as varchar)) ||E't'||
               (CASE WHEN AG.AGOF_SIT = '1' THEN (CASE WHEN CURRENT_DATE BETWEEN AGOF_DATAI AND AGOF_DATAF THEN '1' ELSE '0' END) ELSE '0' END) ||E't'||
               STRING_AGG(CAST(PR.PRAG_PROD_CODIGO AS VARCHAR), ',') ||E't'||
               STRING_AGG(CAST(PR.PRAG_PRECOOFERTA AS VARCHAR), ',') as LAYOUT_1309
          FROM AGOF AG
         INNER JOIN PRAGOF PR ON PR.PRAG_AGOF_CODIGO = AG.AGOF_CODIGO 
         INNER JOIN PRODUTOS PRD ON PRD.PROD_CODIGO = PR.PRAG_PROD_CODIGO
         WHERE AG.AGOF_DIVULGACAO NOT IN ('a8')
         GROUP BY AG.AGOF_CODIGO, AG.AGOF_DESCRICAO, AG.AGOF_DESCRICAO, AG.AGOF_DATAI, AG.AGOF_DATAF, (CASE WHEN AG.AGOF_SIT = '1' THEN (CASE WHEN CURRENT_DATE BETWEEN AGOF_DATAI AND AGOF_DATAF THEN '1' ELSE '0' END) ELSE '0' END)) TO '/home/postgres/RETAIL_PROMOTION_1309_000_AAAAMMDD.TSV' WITH CSV ESCAPE E't' ENCODING 'UTF-8'

但是,如果语句STRING_AGG(CAST(PR.PRAG_PROD_CODIGO AS VARCHAR), ',')返回 1 个以上的结果(用逗号分隔(,则生成的文件在行中带有双引号。我不能用任何东西代替它,这里有一个结果的例子:

5638004 AGENDA                                          224189
"5641004    AGENDA                                      78166,4076,69914,18998,20052,20389,24863,26995,91621,25927,3052,4998,5988,13226,27957,17470"
5658004 AGENDA                                          31313
"5668004    AGENDA                                      12478,2157,841547,14587,4589"
5678004 AGENDA                                          87125
5688004 AGENDA                                          224189

如何发布不要加双引号。

PostgreSQL必须转义包含带引号的分隔符的字符串,否则该文件将不是有效的CSV。

您有两种选择:

  1. 使用与 , 不同的字符作为 string_agg 的第二个参数。

  2. 使用
  3. CSV 格式COPY使用不同的DELIMITER字符。

这样PostgreSQL就不必加引号了。

最新更新