繁体   English   中英

如何使用 java 中的可选子句准备 SQL 查询?

[英]How to prepare an SQL query with optional clauses in java?

我在 java 中的preparedStatement object 遇到了一个小问题。 我有一个带有几个 JTextField(和其他东西)、一个 JTable 和一个按钮的 GUI。 JTable 是使用我的数据库上的 SQL 请求构造的,如下所示:

SELECT date, item, vendor FROM Sells;

我想在用户单击按钮时使用 JTextFields 过滤结果。 假设我们有一个 JTextField 用于日期,另一个用于项目,另一个用于供应商。

如果所有字段都已填写,我可以使用准备好的查询,如下所示:

String query = "SELECT date, item, vendor FROM Sells WHERE date > ? AND item = ? AND vendor = ?";
PreparedStatement prepared = this.connect.prepareStatement(query);
prepared.setString(1, (String)dateField.getText());
prepared.setString(2, (String)itemField.getText());
prepared.setString(3, (String)vendorField.getText());

这(通过一些调整,如 try/catch、变量声明等)效果很好。 我的问题是管理用户仅使用几个字段进行过滤的可能性(例如,仅日期,或日期和项目,但不包括供应商)。 目前,我找不到其他方法:

1) 使用 if 语句测试每个字段的内容,并相应地修改“查询”变量。

2) 使用另一个复杂的 if/else 结构来确定要过滤哪些变量,以及应该使用哪个“prepared.set....”。 这很棘手,因为有时它是一个字符串,但有时是一个 int 或其他任何东西。 当然,确定索引也是一个小问题,因为它不会是相同的eveytime。

我觉得我错过了一些东西,我不应该将这个奇怪的解决方案与多个 if/else 一起使用。 谁能帮我? 有没有更简单的解决方案,或者只是我必须努力做到这一点的情况?

非常感谢!

仅使用您需要的列构建查询语句可能是最有效的方法。 但你也可以这样做:

WHERE (date > ? OR ? IS NULL) AND
      (item = ? OR ? IS NULL) AND
      (vendor = ? OR ? IS NULL)

这需要提供每个参数两次,并假定“空”值为 SQL NULL

这是命名参数简化事情的情况:

WHERE (date > :date OR :date IS NULL) AND
      (item = :item OR :item IS NULL) AND
      (vendor = :vendor OR :vendor IS NULL)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM