选择参数=?但如果?为空白,则返回该列的任何值

uinbv5nw  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(289)

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

String city = request.getParameter("city");

这些值是用户在我的web中编写的值。问题是,如果我的用户不想填写输入,例如city,查询应该考虑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子句,从查询中添加或删除内容。

sczxawaw

sczxawaw1#

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

显然,您必须调整适当设置参数值的代码。

r6l8ljro

r6l8ljro2#

在代码中,您试图将列名作为参数传递,但这不起作用。
只允许传递列的值。
我为你的问题提出另一个解决办法。
考虑以下更简单的陈述:

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 所以它根本就不存在。
因此,您必须检查输入或未输入的值,并调整参数以在任何情况下通过。
这只是一个可以扩展到更多列的想法。

xvw2m8pv

xvw2m8pv3#

假设参数为空,那么您将得到一个结果列表。如果您已经准备好了,那么将参数添加到查询中,条件为不为空或不为空。将数据拉到空位置是不正确的。考虑以其他方式设计。如果有许多空结果,则不能将索引保留在空值上。然后会引发性能问题。

相关问题