【发布时间】:2021-03-16 13:35:38
【问题描述】:
我有一个 PostgreSQL 函数,它接收一个字符串列表,在 Word 表中匹配这些字符串并相应地返回它们。 Word 是一个表,由一个字符串 word 作为主 ID 和该字符串的属性特征组成。
这是函数的工作版本。
CREATE OR REPLACE FUNCTION equals_words(words Text[]) RETURNS SETOF "Word" AS $BODY$
DECLARE
w Text;
BEGIN
FOREACH w IN ARRAY $1
LOOP
RETURN QUERY SELECT * FROM "Word" WHERE word = w
END LOOP;
RETURN;
END; $BODY$ LANGUAGE plpgsql STABLE STRICT;
我希望循环中的语句检查查询是否没有返回任何内容,如果是,则调用另一个函数 longest_prefix(w TEXT) 尝试将 w 与其最长前缀匹配。这是我目前所拥有的。
CREATE OR REPLACE FUNCTION equals_words(words Text[]) RETURNS SETOF "Word" AS $BODY$
DECLARE
w Text;
BEGIN
FOREACH w IN ARRAY $1
LOOP
RETURN QUERY
IF NOT EXISTS(SELECT * FROM "Word" WHERE word = w)
BEGIN
SELECT * FROM longest_prefix(w);
END
END LOOP;
RETURN;
END; $BODY$ LANGUAGE plpgsql STABLE STRICT;
这不起作用,给我以下错误:
ERROR: syntax error at or near "IF"
LINE 8: IF NOT EXISTS(SELECT * FROM "Word" WHERE word = w)
我怀疑 NOT EXISTS 不能在 RETURN QUERY 语句中使用,但我不太确定。如果是这样,有人可以提出替代方案吗?
【问题讨论】:
-
无需遍历数组即可开始
标签: sql postgresql sql-function set-returning-functions