【问题标题】:How to update multiple fields in a table if one them might be blank?如果表中的一个字段可能为空,如何更新表中的多个字段?
【发布时间】:2012-08-07 10:27:02
【问题描述】:

我想在名为 Personnel-table 的表中更新用户个人信息的 5 字段。

用户可能想要更新所有字段、部分字段或根本不更新。

用户可能想要更新的字段是:FirstNameLastNamePasswordUserNameAddress

那段代码就是这样做的:

public boolean updateUserInfo(String _idnumber , String _usernameNew , String _passwordNew ,  
        String _addressNew , String _firstNameNew , String _lastNameNew) throws SQLException
{

    ResultSet resultSet = null;

    String sqlStatement = "UPDATE PersonnelTable set `UserName` = ? WHERE `IdNumber` = ?";
    this.m_prepared = (PreparedStatement) this.m_connection.prepareStatement(sqlStatement);
    this.m_prepared.executeUpdate("USE Personnel");

    // set the ID number & account number 


    /**
     *  first 
     */
    m_prepared.setString(1, _usernameNew);
    m_prepared.setString(2, _idnumber);

    // execute first query - update password
    if (_usernameNew!= "")
    {
        resultSet = m_prepared.executeQuery();
        return true;
    }

    /**
     *  Second 
     */

    sqlStatement = "UPDATE PersonnelTable set `FirstName` = ? WHERE `IdNumber` = ?";
    this.m_prepared = (PreparedStatement) this.m_connection.prepareStatement(sqlStatement);
    m_prepared.setString(1, _firstNameNew);
    m_prepared.setString(2, _idnumber);

    if (_firstNameNew != "")
    {
        resultSet = m_prepared.executeQuery();
        return true;
    }


    /**
     *  Third
     */

    sqlStatement = "UPDATE PersonnelTable set `LastName` = ? WHERE `IdNumber` = ?";
    this.m_prepared = (PreparedStatement) this.m_connection.prepareStatement(sqlStatement);
    m_prepared.setString(1, _lastNameNew);
    m_prepared.setString(2, _idnumber);

    if (_lastNameNew!= "")
    {
        resultSet = m_prepared.executeQuery();
        return true;
    }

    /**
     *  Fourth
     */

    sqlStatement = "UPDATE PersonnelTable set `Address` = ? WHERE `IdNumber` = ?";
    this.m_prepared = (PreparedStatement) this.m_connection.prepareStatement(sqlStatement);
    m_prepared.setString(1, _addressNew);
    m_prepared.setString(2, _idnumber);

    if (_addressNew!= "")
    {
        resultSet = m_prepared.executeQuery();
        return true;
    }



    /**
     *  Fifth
     */

    sqlStatement = "UPDATE PersonnelTable set `Password` = ? WHERE `IdNumber` = ?";
    this.m_prepared = (PreparedStatement) this.m_connection.prepareStatement(sqlStatement);
    m_prepared.setString(1, _passwordNew);
    m_prepared.setString(2, _idnumber);

    if (_passwordNew!= "")
    {
        resultSet = m_prepared.executeQuery();
        return true;
    }



    return false;
} 

但正如您所见,代码太大了,因为我运行了 5 次查询。

如何告诉mysql如果每个字段都不是空字符串"",那么更新 需要的字段,在一个 mysql-query 中?这是可能的还是我每次都必须分开做?

问候

【问题讨论】:

    标签: java mysql phpmyadmin


    【解决方案1】:

    您可以在单个查询中轻松地做到这一点:

    UPDATE PersonnelTable
    SET FirstName = IF(? <> "", ?, FirstName),
        LastName = IF(? <> "", ?, LastName),
        Password = IF(? <> "", ?, Password),
        UserName = IF(? <> "", ?, UserName),
        Address = IF(? <> "", ?, Address)
    WHERE IdNumber = ?;
    

    如果您的字段可以包含 "" 这样的空白值,那么您可以使用 IF(? IS NOT NULL, ?, field_name) 而不是空白。

    【讨论】:

    • 您是否必须为每个给定字段的两个问号复制 setString() 调用?即 m_prepared.setString(1, _firstNameNew); m_prepared.setString(2, _firstNameNew) 等...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 2015-10-03
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多