可能是一个琐碎的问题,但我目前的解决方案可能太多了,我想不起其他任何事情。
我有这个查询(比这个要大得多,我只是想让它更易于阅读)。
SELECT FISCAL_CODE, NAME, SURNAME,
FROM TABLE
WHERE
(FISCAL_CODE = ? OR (SURNAME LIKE ? AND NAME LIKE ? ))
AND TO_DATE(TO_CHAR(DOB, 'DD/MM/YYYY'), 'DD/MM/YYYY') >= TO_DATE(?, 'DD/MM/YYYY')
我的用户现在在开始查询之前有两种情况
我不能简单地对Dob进行=
检查,因为如果用户仅搜索finance_code,则来自用户的dob将为空,从而导致某些搜索结果被错误地省略。
因此,我想出了这个>=
解决方案:现在,如果用户仅在搜索财务代码,则可以从Java中设置?将dob的参数设置为01/01/1000,因此将检索具有该特定财务代码+ dob晚于01/01/1000(在我的数据库中始终如此)的任何记录。
这种方法的问题在于,在我的数据库中,还有一些人没有财务代码,因此,如果用户改为搜索姓名,姓氏和姓氏,并且有同名+姓氏但姓氏不同的人,则该行与这个其他无关的人有关的信息将被检索(因为他的回扣当然也要晚于1000年1月1日,我也不想这样做。
有任何提示吗?
答案 0 :(得分:0)
您需要修正括号:
SELECT FISCAL_CODE, NAME, SURNAME,
FROM TABLE
WHERE (FISCAL_CODE = ?) OR
(SURNAME LIKE ? AND
NAME LIKE ? AND
DOB >= TO_DATE(?, 'DD/MM/YYYY')
);
绝对没有理由仅将DOB
转换为字符串而将其转换回日期。
答案 1 :(得分:0)
如果您根据参数准备条件查询,将会容易得多。就像如果用户提供了一个财务代码,那么就不需要添加不必要的子句,这会使查询复杂化。我建议的解决方案如下所示:
String createSqlQuery(String fiscalCode, String otherField) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT FISCAL_CODE, NAME, SURNAME FROM TABLE WHERE 1 = 1 "); // this 1 = 1 will be useful if none of the following condition evaluates to true
if(fiscalCode != null && !fiscalCode.isEmpty()) {
sql.append("AND FISCAL_CODE = ?");
} else if(otherField != null && !otherField.isEmpty()) {
sql.append("AND (SURNAME LIKE ? OR NAME LIKE ? OR DOB >= ?)");
}
// Obviously you might want to change this logic, it's just a hint
return sql.toString();
}
使用这种方法,您的查询将得到简化。