SQL1:
select regno from student where regno **like 'ABCD%'**
运行成功。但是我怎样才能动态地写like 'ABCD%'呢?
例如:
CREATE OR REPLACE FUNCTION check_regno(refcursor, character varying)
RETURNS refcursor AS
$BODY$
begin
select regno from student where regno $1
return $1;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
现在我想将 $1 作为 'ABCD%' 传递,即:
select check_regno(f1, "like 'ABCD%'")
这将在 $1 处给出错误
:
请建议如何实现这一目标。
最佳答案
正如@Igor 提到的,这很容易出错。我会更进一步:不要这样做。你邀请 SQL 注入(inject)。考虑这个 related answer on dba.SE .
事实上,我在您的问题中根本看不到任何保证动态 SQL 的内容。使用普通 SQL 函数并传递普通字符串值:
CREATE OR REPLACE FUNCTION check_regno(_like bool, _filter text)
RETURNS SETOF text AS
$func$
SELECT regno FROM student
WHERE CASE WHEN $1 THEN regno ~~ $2 ELSE regno !~~ $2 END
$func$ LANGUAGE sql;
~~
和 !~~
是 LIKE
和 NOT LIKE
的 Postgres 运算符(您可以使用).
调用:
SELECT * FROM check_regno(TRUE, 'ABCD%');
SELECT * FROM check_regno(FALSE, 'DEFG%');
关于sql - 在 plpgsql 中动态地写喜欢和不喜欢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18733995/