生成动态sql SELECT语句

时间:2011-04-19 14:18:48

标签: java mysql sql jdbc

我在尝试动态生成从网页中的条目生成的SQL SELECT语句时遇到了一些小麻烦。 基本上我在网站上有一个小搜索引擎,它接受三个参数(价格,城市,品牌),所以我有一个同样的方式构建的JavaBean只有3个属性,相同的。 在数据库上执行SELECT时,我可以使用PreparedStatement

这样做
String sql=select * from product where price<=? and city=? and brand=?;
prep=conn.prepareStatement(sql);
prep.setDouble(1,price);
prep.setString(2,city);
prep.setString(3,brand);

其中prep当然是PreparedStatement obj 当用户没有在网页的字段中插入参数时,我的问题出现了,因为显然他对限制不感兴趣。 我需要找到一种在运行时“剪切”条目的方法,例如:

city field =“”?然后从搜索条件中取出城市:

String sql=select * from product where price<=? and brand=?;

我能做到的一种方法是使用else-if填充servlet中的代码,但这不是我确定的唯一解决方案。 另一个可能的解决方案是使用SQL的IFNULL(expr1,expr2)函数但是如果是null,那么我应该从查询中删除空字段。

你有什么建议吗?

我希望它清楚地解释它的方式。

3 个答案:

答案 0 :(得分:1)

您可以在OR子句中使用WHERE来执行以下操作:

WHERE (Price<=? OR ? IS NULL)
AND   (City = ? OR ? IS NULL)
AND   (Brand = ? OR ? IS NULL)

答案 1 :(得分:0)

尝试用Like'%[input_value]%'替换条件“=”。这样,如果uset留下空白字段,则没有任何限制。

答案 2 :(得分:-1)

您可以将like用于字符串。

String sql = "SELECT * FROM product WHERE price <= ? AND city like '?' AND brand like '?'";
prep = conn.prepareStatement(sql);
prep.setDouble(1, price);
prep.setString(2, city);
prep.setString(3, brand);

请参阅Exact match with sql like and the bind

如果未选择城市/品牌,请将其设置为

prep.setString(2, "%");
prep.setString(3, "%");

如果未选择价格,则使用一些非常大的数字。