有没有办法将比较运算符作为参数传递给 MySQL 查询?
假设我有这个查询
SELECT * FROM `table1` WHERE `column1` > @p
而不是>
我希望能够通过<
或=
取决于条件。我可以使用string.format()
,但我希望我的查询被参数化。
而且我不想使用预定义的查询,只要它们仅在一个运算符上有所不同。
试试这个:
SELECT * FROM `table1`
WHERE (`column1` > @p and @condition = 1)
or (`column1` = @p and @condition = 0)
or (`column1` < @p and @condition = -1)
MySQL 准备好的语句仅支持变量的绑定值。不支持替换查询字符串的任意部分(即使是表名)。换句话说,您必须在客户端上动态构建 SQL。
不幸的是,为了防止 SQL 注入,不能这样做。
但我可以给你一个关于如何做到这一点的想法(解决方法):
SELECT * FROM `table1` WHERE (`column1` > @p AND @op='>') OR (`column1` = @p AND @op='=') OR ........
因此,您可以将运算符传递给代码中的 @op 参数。
这种操作最好使用“switch case”来防止SQL注入。
试试这个:
SET @MyQuery := CONCAT("SELECT * FROM table1 WHERE",@P);
PREPARE stmt1 FROM @MyQuery;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
对于@P:
SET @P:= "> 1" OR SET @P:="=1" or other condition you need to put it