select 其中参数 = ?但如果?是空白 space,return 该列的任何值
select where param = ? but if ? is a blank space, return any value for that column
从我的请求中接收到一些字符串、整数和日期,例如:
String city = request.getParameter("city");
这些值是用户在我的网站上写的。问题是,如果我的用户不想填写输入,例如城市,查询应该考虑城市可以是任何值。因为我要在我的 request.getParameter
中得到一个空白 space(如果用户没有填写输入文本),我试图告诉查询如果参数是一个空白 space,它必须 return 任何值。我试过了:
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... *
查询运行,但未 returning 任何外壳。如果 ? 绑定到空白参数 space,我如何指定它可以是任何值?
PD:我不想构建动态 WHERE 子句,在查询中添加或删除内容。
假设如果参数为空,那么您将得到一个结果列表。如果您为此做好了准备,则将参数添加到条件为非空或空的查询中。空着拉数据是不合适的。考虑以其他方式设计。如果有很多空结果,则不能将索引保留在空值上。然后会触发性能问题。
在您的代码中,您试图将列名作为参数传递,但这不起作用。
您只能为列传递值。
我为您的问题提出了另一种解决方案。
考虑这个更简单的语句:
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
所以它甚至不存在。
所以你必须检查输入或未输入的值并调整参数以在任何情况下通过。
这只是一个想法,您可以扩展更多列。
在您的 where 子句中,(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 ('', ?)
显然,您必须适当调整设置参数值的代码。
从我的请求中接收到一些字符串、整数和日期,例如:
String city = request.getParameter("city");
这些值是用户在我的网站上写的。问题是,如果我的用户不想填写输入,例如城市,查询应该考虑城市可以是任何值。因为我要在我的 request.getParameter
中得到一个空白 space(如果用户没有填写输入文本),我试图告诉查询如果参数是一个空白 space,它必须 return 任何值。我试过了:
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... *
查询运行,但未 returning 任何外壳。如果 ? 绑定到空白参数 space,我如何指定它可以是任何值?
PD:我不想构建动态 WHERE 子句,在查询中添加或删除内容。
假设如果参数为空,那么您将得到一个结果列表。如果您为此做好了准备,则将参数添加到条件为非空或空的查询中。空着拉数据是不合适的。考虑以其他方式设计。如果有很多空结果,则不能将索引保留在空值上。然后会触发性能问题。
在您的代码中,您试图将列名作为参数传递,但这不起作用。
您只能为列传递值。
我为您的问题提出了另一种解决方案。
考虑这个更简单的语句:
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
所以它甚至不存在。
所以你必须检查输入或未输入的值并调整参数以在任何情况下通过。
这只是一个想法,您可以扩展更多列。
在您的 where 子句中,(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 ('', ?)
显然,您必须适当调整设置参数值的代码。