正确的条件在这个简单的查询中..我缺少什么?

时间:2019-07-09 14:43:01

标签: java sql

可能是一个琐碎的问题,但我目前的解决方案可能太多了,我想不起其他任何事情。

我有这个查询(比这个要大得多,我只是想让它更易于阅读)。

 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')

我的用户现在在开始查询之前有两种情况

  1. 他只能输入财务代码
  2. 他可以同时输入姓名,姓氏和出生日期(出生日期)

我不能简单地对Dob进行=检查,因为如果用户仅搜索finance_code,则来自用户的dob将为空,从而导致某些搜索结果被错误地省略。

因此,我想出了这个>=解决方案:现在,如果用户仅在搜索财务代码,则可以从Java中设置?将dob的参数设置为01/01/1000,因此将检索具有该特定财务代码+ dob晚于01/01/1000(在我的数据库中始终如此)的任何记录。

这种方法的问题在于,在我的数据库中,还有一些人没有财务代码,因此,如果用户改为搜索姓名,姓氏和姓氏,并且有同名+姓氏但姓氏不同的人,则该行与这个其他无关的人有关的信息将被检索(因为他的回扣当然也要晚于1000年1月1日,我也不想这样做。

有任何提示吗?

2 个答案:

答案 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();
}

使用这种方法,您的查询将得到简化。