我想知道是否有任何智能方法可以为搜索引擎制作一个SQL语句,其中有5个可选参数。可以使用所有参数,也可以只使用其中一个参数,也可以混合使用任何参数。这样可以生成3000多种不同的组合。
该语句需要做好准备以避免SQL注入。
我看过this帖子,但它很适合。
我正在寻找的是,
String sql = SELECT * FROM table WHERE(optional1)=? AND(可选2)=? AND(可选3)=? AND(可选4)=? AND(可选5)=?
prepared.setString(1,optional1) 等等...
答案 0 :(得分:3)
使用您的java代码根据参数的存在(它们的长度或存在,以较小者为准)将选项添加到where子句。这样,如果不需要可选参数,它甚至不会成为SQL表达式的一部分。简单。
答案 1 :(得分:3)
我相信它应该有用(虽然没有经过测试)
SELECT * FROM table
WHERE
field1 = CASE
WHEN ? IS NULL THEN field1
ELSE ?
END AND
field2 = CASE
WHEN ? IS NULL THEN field2
ELSE ?
END AND .... etc
//java code
if ([optional1 is required])
{
prepared.setString(1, optional1) ;
prepared.setString(2, optional1) ;
}
else
{
prepared.setNull(1, java.sql.Types.VARCHAR) ;
prepared.setNull(2, java.sql.Types.VARCHAR) ;
}
等
答案 2 :(得分:2)
@ a1ex07已经给出了作为单个查询执行此操作的答案。在每种情况下使用NULL并检查它们。
WHERE
table.x = CASE WHEN @x IS NULL THEN table.x ELSE @x END
...或
WHERE
(@x IS NULL OR table.x = @x)
...或
WHERE
table.x = COALESCE(@x, table.x)
等等。
然而,有一个警告;尽管使一个查询完成所有这些操作非常方便,但这些答案的所有都是次优的。通常他们都很有意思。
编写一个查询时,只创建一个执行计划。并且ONE执行计划必须适合所有可能的值组合。但是,这会修复搜索哪些索引,搜索它们的顺序等等。它会为一个通用的查询生成最差的计划。
相反,您最好根据需要添加条件。您仍然对它们进行参数化,但如果您知道参数为NULL,则不包含条件。
这是一个很好的链接,进一步解释它,它专门用于MS SQL Server,但它通常适用于任何在编译SQL后缓存计划的RDBMS。