SQL |仅使用非空值构建SQL更新查询的最佳实践

时间:2018-04-13 06:04:21

标签: sql oracle sql-update

寻找构建非空值更新查询的最佳实践。

在我的实现下面,传递参数firstName,middleName,lastName,address可以为null。我想构建一个仅具有非null值的更新查询。我已使用多个if条件为非null和逗号分隔符。

public void updatePerson(String id, String firstName, String middleName, String lastName, String address) {
    StringBuilder query = new StringBuilder("UPDATE PERSON SET ");
    MapSqlParameterSource mapSqlParameterSource = new MapSqlParameterSource();
    mapSqlParameterSource.addValue("id", id);
    boolean columnSepartor = false;

    if (firstName != null) {
        query.append(" FIRST_NAME =:firstName");
        mapSqlParameterSource.addValue("firstName", firstName);
        columnSepartor = true;
    }

    if (middleName != null) {
        query = columnSepartor ? query.append(", MIDDLE_NAME =:middleName") : query.append(" MIDDLE_NAME =:middleName");
        mapSqlParameterSource.addValue("middleName", middleName);
        columnSepartor = true;
    }

    if (lastName != null) {
        query = columnSepartor ? query.append(", LAST_NAME =:lastName") : query.append(" LAST_NAME =:lastName");
        mapSqlParameterSource.addValue("lastName", lastName);
        columnSepartor = true;
    }

    if (address != null) {
        query = columnSepartor ? query.append(", ADDRESS =:address") : query.append(" ADDRESS =:address");
        mapSqlParameterSource.addValue("address", address);
    }

    query.append(" WHERE ID  =:id");
    namedParameterJdbcTemplate.update(query.toString(), mapSqlParameterSource);
}

请建议针对此类用例的最佳做法。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

这将是我对该要求的首选实施方案。它很小,很容易理解,它对绝大多数应用程序也能表现得很好。

coalesce 表达式返回第一个非null值。在这种情况下,它返回新值(如果有),否则返回列中的现有值。

update person
   set first_name  = coalesce(:firstName,  first_name)
      ,middle_name = coalesce(:middleName, middle_name)
      ,last_name   = coalesce(:lastName,   last_name)
      ,address     = coalesce(:address,    address)
 where id = :id

答案 1 :(得分:0)

您可以按如下方式构建SQL命令:

UPDATE <your table>
  SET FirstName = NVL(PassedFirstName , FirstName) ,
      MidName   = NVL(PassedMidName   , MidName  ) , 
      LastName  = NVL(PassedLastName  , LastName ) ...
 WHERE...

表示对于任何传递的空值,使用原始值更新记录。