java - Oracle SQL 查询不带所有参数

标签 java sql

得到这个sql(等级之间的选择):

//Variables come from outside or other classes etc... 
"SELECT * from users where dept_name= ? AND birth_date >=? AND birth_date <=? AND money >=? AND money <=?;  
//Long preparedStatement code...

使用下面的代码将 dept_name 传递给 sql:

System.out.println("Insert department name: ");
Scanner alpha = new Scanner(System.in);
String dept_name= alpha.nextLine();

如果我不在扫描仪上插入任何东西而只是按 Enter 键,会发生什么情况?就像我想跳过按部门名称搜索而只想在出生日期和金钱排名之间搜索一样?

我该如何处理:

pstmt.setString(1, users.getDeptname()); //prepared statement

如果之前在 dept_id 上收到了“enter”字符?

Oracle 如何忽略 dept_name =?如果“?”中没有传递勇气使用准备好的语句并使用 SQL 中的下一个字段继续查询?

最佳答案

您可以将查询修改为类似

SELECT * FROM users 
WHERE (dept_name = ? OR ? IS NULL) AND .....

然后在代码中设置 pstmt.setString(1, dept_name); pstmt.setString(2,部门名称);

但是,我宁愿有多个陈述,也不愿有一个适合所有情况的陈述。任何通用方法的问题都是性能。优化器将无法生成良好的执行计划。例如,如果设置了用户名,则基础索引的范围/唯一扫描肯定优于全表扫描。尽管 Oracle 11 及更高版本具有绑定(bind)感知等出色功能,但我不能 100% 确定它会以最佳方式处理所有情况。

关于java - Oracle SQL 查询不带所有参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25918889/

相关文章:

mySQL - 根据顺序值选择记录,然后在一个查询中随机记录

mysql - 如何在 MYSQL 的 COUNT 中使用 SELECT

java - Java 中的国际化自动换行

java - 如何在 Java Spring 中格式化 JSON 响应?

java - 读取一个字符行到数组直到下一行JAVA

sql - 后台深度查询

mysql - 如何将 sql 格式更改为天数而不是数字?

java - 在 wildfly-swarm 上使用 TestNG 进行 Arquillian 测试

java - 在引入时区之前正确的时区是什么?

mysql - 使用带有日期字符串的 LIKE 子句进行查询