从Postgres中的多维数组参数中选择

时间:2015-04-01 21:41:49

标签: postgresql

我有一个函数在父表中执行插入,然后插入子表。最后一个参数是一个可变长度的数组。我使用它来通过发送逗号分隔对的数组并解析它们来插入子表。

create or replace function neil_test(time_stamp timestamp with time zone, type_id text, raw_message text,field_values text[])
returns void

AS $$
    DECLARE 
    last_message_id bigint;
    x text;
BEGIN
    INSERT INTO message(time_stamp,type_id,raw_message) values(time_stamp,type_id,raw_message);
    select into  last_message_id currval(pg_get_serial_sequence('message', 'id'));
    foreach x in ARRAY field_values
    LOOP
        insert into message_field_value(last_message_id,field_id,fieldValue) select left(x,strpos(x,',')-1), right(x,length(x)-strpos(x,','));
    END LOOP;
END
$$LANGUAGE plpgsql

它的名字是这样的:

select neil_test('2001-01-01 08:00:00.1234','F','RAW',ARRAY['One,value1','two,value2','three,value3'])

这样可行,但我真正想做的是直接使用数组。类似的东西:

     select neil_test('2001-01-01 08:00:00.1234','F',
'RAW',ARRAY[['One', 'value1'],['two','value2'],['three','value3']])

...

 insert into message_field_value(last_message_id,fieldid, field value) 
select field_values[1], field_values[2]

我已尝试过不必要的功能,但这并不起作用,因为它似乎使整个阵列变得平坦而我失去了对。 Postgres数组甚至可以实现这样的功能吗?

1 个答案:

答案 0 :(得分:0)

FOREACH语句中使用SLICE来迭代多维数组的元素。没有SLICE,它会迭代数组的各个元素。这对我有用:

CREATE OR REPLACE FUNCTION neil_test2(time_stamp timestamp with time zone, type_id text, raw_message text,field_values text[][2])
RETURNS void 
AS $$
DECLARE
    last_message_id bigint;
    x TEXT[];
BEGIN
    INSERT INTO message(time_stamp,type_id,raw_message) VALUES (time_stamp,type_id,raw_message);
    SELECT INTO  last_message_id currval(pg_get_serial_sequence('message', 'id'));
    FOREACH x SLICE 1 in ARRAY field_values LOOP
        INSERT INTO message_field_value(last_message_id, field_id, field_value) SELECT last_message_id, x[1], x[2];
    END LOOP;
END
$$LANGUAGE plpgsql;