2017-12-07 12 views
0

可変数の列を持つテーブルに動的なinsertを実行する必要があります。今、私はquote_nullableで、quote_identと列名、および実際の値の両方を引用して、array_to_stringでそれらに参加してい配列をレコード/タプル/行型に変換するにはどうすればよいですか?

for ... loop 
    ... 
    cols := array_append(cols, quote_ident(column_name)); 
    vals := array_append(vals, quote_nullable(column_value)); 
end loop; 

execute format('insert into %s (%s) values (%s)', 
    target_table, 
    array_to_string(cols, ', ') 
    array_to_string(vals, ', ') 
); 

それがパターンだが含めて、すべての場所で見つかりました公式文書に記載されています。しかし、それは少し汚れているように感じます。私が達成したいものです

execute format('insert into %s (%s) ... $1 ...', 
    target_table, 
    array_to_string(cols, ', ') 
) 
using vals; 

お知らせusing vals、:私はむしろusing句で値の配列パラメータを渡すと思います。しかし、insertステートメントのドットを埋めることができないようです。多分何らかの種類のselect ... from ...

さらに一般的には、配列をレコード/タプル/行型にするにはどうすればよいですか?

答えて

0

私は生産に非常にこのようなコードを使用しています:

EXECUTE (SELECT 'insert into sometable ' 
    '('||string_agg(quote_ident(p.key),',') || 
      ') values ('|| string_agg(quote_nullable(p.value),',') || ');' 
      FROM each(payload) as p 
      ); 

が、ここペイロードはhstoreのではなく、配列のペアです。

+0

クエリのSQL部分を作成しているので、 'quote_ident'はOKです。しかし、私は値の 'quote_nullable'をすべて避け、配列パラメータとして渡す方法を探しています。 – Tobia

+0

私はあなたがしていたことを全く誤解しました。 – Jasen

関連する問題