sql - 在 plpgsql 中动态地写喜欢和不喜欢

标签 sql postgresql plpgsql dynamic-sql sql-like

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;

~~!~~LIKENOT LIKE 的 Postgres 运算符(您可以使用).

调用:

SELECT * FROM check_regno(TRUE, 'ABCD%');
SELECT * FROM check_regno(FALSE, 'DEFG%');

关于sql - 在 plpgsql 中动态地写喜欢和不喜欢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18733995/

相关文章:

sql - 特殊字符或仅字符/数字的测试列

python - Django:使用多个键通过中间表创建 M2M 关系

sql - 帮助基本的 SQL QUERY

database - 如何查询以在 postgresql 中生成另一列来更新数组列?

postgresql - 使用 JDBC ResultSet 设置 PostgreSQL 枚举

postgresql - 添加主键 : Table contains duplicated values

postgresql - Javascript encodeURI 类似于 postgresql 中的函数?

c# - 无法加载文件或程序集 'microsoft.sqlserver.batchparserclient'

sql - 为什么这个 LEFT JOIN 运行缓慢?

sql - 将 PostgreSQL 函数包装在另一个函数中以有条件地组合结果