如何创建一个多搜索SQL语句,其中所有参数都是可选的?

时间:2011-12-20 18:50:27

标签: java sql jdbc

我想知道是否有任何智能方法可以为搜索引擎制作一个SQL语句,其中有5个可选参数。可以使用所有参数,也可以只使用其中一个参数,也可以混合使用任何参数。这样可以生成3000多种不同的组合。

该语句需要做好准备以避免SQL注入。

我看过this帖子,但它很适合。

我正在寻找的是,

String sql = SELECT * FROM table WHERE(optional1)=? AND(可选2)=? AND(可选3)=? AND(可选4)=? AND(可选5)=?

prepared.setString(1,optional1) 等等...

3 个答案:

答案 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。

http://www.sommarskog.se/dyn-search.html