我有很重的查詢與FOR
循環重寫,並希望做到這一點更簡單,使用更多的SQL而不是plpgsql結構。查詢看起來像:從plpgsql中的FOR循環切換到基於集合的SQL命令
FOR big_xml IN SELECT unnest(xpath('//TAG1', my_xml)) LOOP
str_xml = unnest(xpath('/TAG2/TYPE/text()', big_xml));
FOR single_xml IN SELECT unnest(xpath('/TAG2/single', big_xml)) LOOP
CASE str_xml::INT
WHEN 1
THEN
INSERT INTO tab1(id, xml) VALUES (1, single_xml);
WHEN 2
THEN
INSERT INTO tab2(id, xml) VALUES (1, single_xml);
WHEN 3
[...]
WHEN 11
[...]
ELSE
RAISE EXCEPTION 'something'
END CASE;
END LOOP;
END LOOP;
RETURN xmlelement(NAME "out", xmlforest(1 AS out));
我開始重寫它有更好的表現:
INSERT INTO tab1(id, xml)
SELECT 1, unnest(xpath('/TAG2/single', (SELECT unnest(xpath('//TAG1', my_xml))));
但我不知道如何處理這些CASE ... INSERT
語句。 任何想法? 或者,也許我的做法是完全錯誤的?
編輯14年2月25日:在PostgreSQL 9.3.1
一如往常,樣本值和您的Postgres版本將有所幫助。 –
'unnest()'在你的原始語句中沒有任何意義:'str_xml = unnest(xpath('/ TAG2/TYPE/text()',big_xml))''。如果返回多行,則代碼會中斷;如果這不可能發生,'unnest()'沒有意義... –