如何将带语句结果复制到Postgresql中的本地

问题描述

我下面有声明和复制命令

with output01 as
(select * from (
select name,case
    when column1 is not null and lower(column1) in ('point1','point2','point3','point4') then 3456
    else null end column1Desc,case
    when column2 is not null and lower(column2) in ('point1','point4') then 2456
    else null end column2Desc,column3,column4),output02 as
(select * from (
select name,output3 as (SELECT * FROM output01 UNION ALL SELECT * FROM output02)

\copy (select * from output3) to '/usr/share/output.csv' with CSV ENCODING 'UTF-8' DELIMITER ',' HEADER;

我正在跟踪错误

错误:关系“ tab3”不存在

解决方法

所有psql反斜杠命令都必须写在一行上,因此不能与\copy一起使用多行查询。唯一的解决方法是使用该查询创建一个(临时的)视图,然后在\copy命令中使用该视图。

大致情况:

create temporary view data_to_export
as
with cte as (..)
select * 
from cte
;

\copy (select * data_to_export) to ...
,

您收到此错误,是因为您在不同的语句中运行CTE查询和copy命令。考虑到您的with查询工作正常,您应该像下面这样编写copy语句:

\copy (WITH tab1 as (Your SQL statement),tab2 as ( SELECT ... FROM tab1 WHERE your filter),tab3 as ( SELECT ... FROM tab2 WHERE your filter)
SELECT * FROM tab3) to '/usr/share/results.csv' with CSV ENCODING 'UTF-8' DELIMITER ',' HEADER;