如何将数组转换为记录/元组/行类型?

时间:2017-12-07 16:19:59

标签: arrays postgresql dynamicquery

我需要在具有可变列数的表中执行动态insert

现在,我引用quote_ident的列名和quote_nullable的实际值,然后用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, ', ')
);

这是一个遍布各处的模式,包括官方文档。但感觉有点不洁净。我宁愿将值数组传递给using子句中的参数:

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

请注意using vals,这是我想要实现的目标。但我似乎无法填写insert声明中的点。也许某种select ... from ...

更一般地说,如何将数组转换为记录/元组/行类型?

1 个答案:

答案 0 :(得分: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,而不是一对数组。