【问题标题】:AWS Redshift dynamically select column name from RECORDAWS Redshift 从 RECORD 中动态选择列名
【发布时间】:2021-11-28 07:31:05
【问题描述】:

我在 AWS redshift 中创建了以下程序。 在 query2(在 ????)中,我想根据字段输入变量中提供的值从 rec 中选择列。 例如如果 field = 'Fname' 那么在 query2 中它应该插入 rec.Fname。

请告诉我如何在打开的游标中从 RECORD 中动态选择列名。

CREATE OR REPLACE PROCEDURE test3(source_table varchar(100), target_table varchar(100), field varchar(100) )
    LANGUAGE plpgsql
AS $$   
declare
  query1 text;
  query2 text;
  rec RECORD;
begin
    query1 := 'SELECT id, ' || field ||', load_date, end_date FROM ' || source_table || ' ORDER BY id, load_date';
FOR rec IN execute query1
  loop
    query2 := 'insert into '|| target_table ||' values ('||quote_literal(rec.id)||', '||quote_literal(field)||','||**????**||','||quote_literal(rec.load_date)||')';
        execute query2;
  END LOOP;
  RETURN;
END;
$$
;

【问题讨论】:

    标签: amazon-web-services stored-procedures amazon-redshift dynamic-sql


    【解决方案1】:

    现在还早,所以让我参考一下我针对类似情况给出的答案(插入而不是选择)。这应该让你开始 - How to join System tables or Information Schema tables with User defined tables in Redshift

    代码如下:

    CREATE OR REPLACE procedure rewrite_data()
    AS
    $$
    DECLARE 
      row record;
    BEGIN
      drop table if exists fred;
      create table fred (schemaname varchar(256),tablename varchar(256),"column"varchar(256), "type"varchar(256));
      for row in select "schemaname"::text, "tablename"::text, "column"::text, "type"::text from pg_table_def where "schemaname" <> 'pg_catalog' LOOP
        INSERT INTO fred(schemaname,tablename,"column","type") VALUES (row.schemaname,row.tablename,row."column",row."type");
      END LOOP;
    END;
    $$ LANGUAGE plpgsql;
    call rewrite_data();
    select * from fred;
    

    鉴于您已经在存储过程上取得了这么大的进步,这应该会让您越过终点线。

    【讨论】:

    • 嗨,比尔,感谢您的回复。我尝试使用它,但无法到达我想要的位置。我希望行中“列”的值。“列”是动态的,基于 INPUT 参数中提供的值。在上面的查询中,行中的字段名称是固定的。有什么方法可以创建一个动态 SQL,它可以使用变量/参数值来选择打开记录中的字段。
    • 在重写时,您不能在存储过程查询中直接将变量用作列名或表名。相反,您需要编写一个查询字符串并执行它。像 - “EXECUTE 'SELECT id, ' || field ||', load_date, end_date FROM ' || source_table || ' ORDER BY id, load_date';”。
    • 谢谢比尔!我得到了一个解决方案,我的挑战通过重命名 query1 中的输入 column_name 得到了解决:) 我可以在 query2 中使用该重命名的字段,无需动态填充它。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    相关资源
    最近更新 更多