我想在plpgsql函数中使用ltree param执行查询...但是我不能理解如何在这个函数中使用引号......
CREATE OR REPLACE FUNCTION f_select(BIGINT) RETURNS setof categories AS
$$
DECLARE
s_cat ALIAS FOR $1;
queryText TEXT;
result categories%ROWTYPE;
BEGIN
queryText := 'SELECT * FROM categories WHERE cat_tree ~ \'*.\'|| s_cat::text ||\'.*\'';
FOR result IN EXECUTE queryText
LOOP
RETURN NEXT result;
END LOOP;
RETURN;
END
$$
LANGUAGE plpgsql;
怎么做???
在psql中执行此代码后,我收到错误:
ERROR: syntax error at or near "."
LINE 10: ... := 'SELECT * FROM categories WHERE cat_tree ~ \'*.\'|| s_ca...
最终工作证书:
CREATE OR REPLACE FUNCTION f_select(BIGINT) RETURNS setof categories AS
$$
DECLARE
s_cat ALIAS FOR $1;
queryText TEXT;
result categories%ROWTYPE;
BEGIN
queryText := 'SELECT * FROM categories WHERE cat_tree ~ ''' || ('*.'|| s_cat::text || '.*')::lquery || '''';
FOR result IN EXECUTE queryText
LOOP
RETURN NEXT result;
END LOOP;
RETURN;
END
$$
LANGUAGE plpgsql;
答案 0 :(得分:1)
问题似乎是滥用反斜杠,但无论如何都不应该首先将此查询放入文本变量中。
这种形式怎么样:
FOR result IN SELECT * FROM categories WHERE cat_tree ~ '*.'|| s_cat::text || '.*'
LOOP
RETURN NEXT result;
END LOOP;
如果LOOP只需要返回结果,你也可以避免它并直接返回查询:
RETURN QUERY SELECT * FROM categories WHERE cat_tree ~ '*.'|| s_cat::text || '.*';
修改强>
由于运算符为ltree ~ lquery
且~
比||
更紧密,因此右操作数应加括号并转换为lquery
:
RETURN QUERY SELECT * FROM categories
WHERE cat_tree ~ ('*.'|| s_cat::text || '.*')::lquery;