选择param =?但是如果呢?是一个空格,返回该列的任何值

时间:2018-11-15 20:00:54

标签: java mysql servlets request prepared-statement

从我的请求中接收一些字符串,整数和日期,例如:

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子句,也不要在查询中添加或删除内容。

3 个答案:

答案 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 ('', ?)

显然,您将不得不调整用于适当设置参数值的代码。