|
我想创造一个items基于返回函数tags。但是,我不知道该怎么办IN()句中格式化数组。我相信这就是为什么我没有结果。7 K+ t ?/ _/ a$ `" L' w8 I
这是我得到的:8 J0 G: L4 D. i, ^" }2 T
CREATE OR REPLACE FUNCTION getItemsByTag(tags text[]) RETURNS TABLE (id bigint,title text,tag text[]) AS $$BEGIN IF array_length(tags,1) > 0 THEN EXECUTE format SELECT d.id,d.title,array_agg(t.title) FROM items d INNER JOIN item_tags dt ON dt.item_id = d.id INNER JOIN tags t ON t.id = dt.tag_id AND t.title IN (%L) GROUP BY d.id,d.title array_to_string(tags,,);-- ELSE ... END IF;END;$$ LANGUAGE plpgsql;然后,当我打电话给我: v0 H+ i/ a; \1 W" X) g
select getItemsByTag('{"gaming","sport"}');即使有标有游戏的项目,我也没有得到结果。. s+ u. M# l& `/ V, k+ k
测试用例CREATE TABLE items(id serial primary key,title text);CREATE TABLE tags(id serial primary key,title text);CREATE TABLE item_tags(item_id int references items(id),tag_id int references tags(id),primary key(item_id,tag_id));insert into items (title) values ('my title my title 2');insert into tags (title) values ('tag1'),('tag2');insert into item_tags (item_id,tag_id) values (1,1),(1,2);功能:
6 N. b' W; u- q8 K/ CCREATE OR REPLACE FUNCTION getItemsByTag(tags text[]) RETURNS TABLE (id bigint,title text,tag text[]) AS $$BEGIN IF array_length(tags,1) > 0 THEN EXECUTE format SELECT d.id,d.title,array_agg(t.title) FROM items d INNER JOIN item_tags dt ON dt.item_id = d.id INNER JOIN tags t ON t.id = dt.tag_id AND t.title IN (%L) GROUP BY d.id,d.title array_to_string(tags,,);-- ELSE ... END IF;END;$$ LANGUAGE plpgsql;称呼:
1 n# k3 `% ^$ Z3 a: Z/ j select getItemsByTag('{"tag1","tag2"}); 7 Y2 W0 W* ~5 m8 _
解决方案: |
|