从我的请求中接收一些字符串,整数和日期,例如:
String city = request.getParameter("city");
这些值是用户在我的网络中写的值。问题是,如果我的用户不想填写输入(例如,城市),则查询应考虑城市可以是任何值。由于我的request.getParameter
中将有一个空格(如果用户未填写输入文本),我试图告诉查询该参数是否为空格,它必须返回任何值。我尝试过:
String getResults = "SELECT id_housing, name, description_short, price, photo FROM housing
WHERE (city = ? OR ? = '')AND init_date <= ? AND end_date >= ? AND (price = ? OR ? = '') AND (guests = ? OR ? = '')";
PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, city);
stmt.setString(2, city);
stmt.setDate(3, new java.sql.Date(initDate.getTime()));
* and so on... *
查询运行,但不返回任何外壳。如果?是绑定到空白参数的值,如何将其设为任意值?
PD:我宁愿不构建动态的WHERE子句,也不要在查询中添加或删除内容。
答案 0 :(得分:1)
假设参数为空,则将获得结果列表。如果您为此做好了准备,请在条件为不为空或为空时将参数添加到查询中。将数据拉为空是不正确的。考虑以其他方式进行设计。如果有很多空结果,则不能将索引保留为空值。然后它将触发性能问题。
答案 1 :(得分:1)
在您的代码中,您试图将列名作为参数传递,但这不起作用。
只允许您为列传递值。
我为您的问题提出了另一种解决方案。
考虑以下简单语句:
String getResults = "SELECT id_housing, name, description_short, price, photo FROM housing
WHERE (city = ? OR 1 = ?)
(1)(如果用户输入了有效值),则您的代码将是:
PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, city_text);
stmt.setString(2, 0);
因此WHERE
子句如下:
WHERE (city = city_text OR 1 = 0)
由于1 = 0
始终为false
,因此其余部分city = city_text
将获取所需的行。
(2)如果用户未未输入,则您的代码将为:
PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, "");
stmt.setString(2, 1);
因此WHERE
子句如下:
WHERE (city = '' OR 1 = 1)
由于1 = 1
始终为true
,因此整个布尔语句(city = '' OR 1 = 1)
将为true
,因此它根本不存在。
因此,您必须检查输入或未输入的值,并调整参数以在任何情况下通过。
这只是一个想法,您可以扩展更多的列。
答案 2 :(得分:1)
在您的子句中,(city = ? OR ? = '')
应该是(city = ? OR city = '')
。
所以:
SELECT id_housing, name, description_short, price, photo FROM housing
WHERE (city = ? OR city = '')
AND init_date <= ? AND end_date >= ?
AND (price = ? OR price = '')
AND (guests = ? OR guests = '')
这等效:
SELECT id_housing, name, description_short, price, photo FROM housing
WHERE city in ('', ?)
AND init_date <= ? AND end_date >= ?
AND price in ('', ?)
AND guests in ('', ?)
显然,您将不得不调整用于适当设置参数值的代码。