Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于标志在PL/pgsql中构建不同列的查询_Sql_Postgresql_Plpgsql - Fatal编程技术网

基于标志在PL/pgsql中构建不同列的查询

基于标志在PL/pgsql中构建不同列的查询,sql,postgresql,plpgsql,Sql,Postgresql,Plpgsql,我需要在PL/pgSQL中运行以下语句 if file_record.has_recieved_time_column then EXECUTE FORMAT('COPY mytemp (columnA, columnB, columnC) FROM %L DELIMITER '','' CSV HEADER;', file_re

我需要在PL/pgSQL中运行以下语句

    if file_record.has_recieved_time_column then
        EXECUTE FORMAT('COPY mytemp (columnA, columnB, columnC)
                        FROM %L
                        DELIMITER '',''
                        CSV HEADER;', file_record.file_path);
    elseif file_record.has_header then
        -- dont load columnC
        EXECUTE FORMAT('COPY mytemp (columnA, columnB)
                        FROM %L
                        DELIMITER '',''
                        CSV HEADER;', file_record.file_path);
    else
        -- dont load columnC and the file has no header
        EXECUTE FORMAT('COPY mytemp (columnA, columnB)
                        FROM %L
                        DELIMITER '',''
                        CSV;', file_record.file_path);
    end if;

如何避免在这段代码中重复自己的操作?

尝试使用默认值创建变量
columnA、columnB
,然后在需要时使用
columnC
继续,例如

  cols := 'columnA, columnB';
  
  IF file_record.has_recieved_time_column THEN
    cols = cols || ',columnC';
  ELSEIF file_record.has_header THEN
    cols = cols || ',columnX';
  ELSE
    .... 
  END IF;
  
  EXECUTE FORMAT('COPY mytemp (%L) FROM %L DELIMITER '',''CSV HEADER;', cols, file_record.file_path);

您有三个不同的
COPY
语句。你重复是什么意思?函数是否继续使用多个IF/ELSE?理想情况下,我希望通过某种方式定义
cols=(colA,colB)来建立查询
然后执行
如果file_record.has_received_time_column:cols+=colC
然后将
cols
作为参数传递到
COPY
语句中,并对
头执行类似的操作这正是我要寻找的,是否有办法以同样的方式解决头问题,我可以设置一个空字符串的header变量并用header替换它,然后像现在一样使用%L吗?@sev绝对可以。只需将
COPY
字符串中的
HEADER
替换为
%L
,并在
FORMAT
命令末尾添加一个额外变量。@sev类似于
EXECUTE FORMAT('COPY mytemp(%L)FROM%L DELIMITER','CSV%L;',cols,file\u record.file\u path,HEADER\u variable)