1

我想在 plpgsql 函数中使用 ltree 参数执行查询......但我不明白如何在这个函数中使用引号......

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;
4

1 回答 1

2

问题似乎是滥用反斜杠,但无论如何,首先不应该将此查询放入文本变量中。

这个表格怎么样:

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 || '.*';

编辑: 由于运算符 isltree ~ lquery并且~绑定比 更紧密||,因此正确的操作数应该用括号括起来并强制转换为lquery

 RETURN QUERY SELECT * FROM categories
   WHERE cat_tree ~ ('*.'|| s_cat::text || '.*')::lquery;
于 2013-09-10T16:39:41.973 回答