【问题标题】:Building query in PL/pgsql with different columns based on flag在 PL/pgsql 中使用基于标志的不同列构建查询
【发布时间】:2021-05-12 11:32:57
【问题描述】:

我需要在 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;

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

【问题讨论】:

  • 您有三个不同的COPY 语句。重复是什么意思?该功能是否与多个 IF / ELSE 一起使用?
  • 理想情况下,我想通过以某种方式定义cols = (colA, colB) 然后执行if file_record.has_recieved_time_column: cols += colC 然后将cols 作为参数传递给COPY 语句并为@ 执行类似的操作来构建查询987654327@

标签: sql postgresql plpgsql


【解决方案1】:

尝试使用默认值 columnA,columnB 创建变量 cols,然后在需要时将其与 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);

【讨论】:

  • 这正是我一直在寻找的,有没有办法以同样的方式解决标题问题,我可以设置一个空字符串的标题变量并将其替换为 HEADER 然后使用%L 和你现在一样吗?
  • @sev 绝对。只需将COPY 字符串中的HEADER 替换为%L 并在FORMAT 命令的末尾添加一个额外的变量。
  • @sev 类似EXECUTE FORMAT('COPY mytemp (%L) FROM %L DELIMITER '',''CSV %L;', cols, file_record.file_path,header_variable);
猜你喜欢
  • 2012-05-21
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多