【问题标题】:How do I deal with optional columns when constructing a prepared statement构造准备好的语句时如何处理可选列
【发布时间】:2016-07-17 07:34:52
【问题描述】:

我想利用准备好的语句来插入/更新 postgres 数据库。 问题是该表包含可以为空的列,我在运行时可能有也可能没有值。
如果我没有任何要插入/更新的内容,我需要保留旧值。
有没有我可以用于这种情况的语法?
在这种情况下,最好的做法是什么,这似乎是一个非常普遍的问题?

附言 我使用带有普通 jdbc 的 java/scala。

【问题讨论】:

    标签: java database postgresql jdbc prepared-statement


    【解决方案1】:

    当然,您可以只构造一个不包含您不想更新的列的语句。

    如果这不是您的用例中的一个选项,您可以构造一个带有“标志”的 case 表达式来指示是否应该绑定列。

    例如:

    String sql = "UPDATE mytable " +
                 "SET " +
                 "col1 = CASE(? WHEN 1 THEN ? ELSE col1 END), " +
                 "col2 = CASE(? WHEN 1 THEN ? ELSE col2 END) " +
                 "WHERE id = ?";
    
    PreparedStatement ps = con.prepareStatement(sql);
    
    // col1 should be updated
    ps.setInt(1, 1);
    ps.setString(2, newValueCol1);
    
    // col2 should not be updated
    ps.setInt(3, 0);
    ps.setString(4, null); // or any other value...
    
    // bind the where clause
    ps.setInt(5, someId);
    
    ps.executeUpdate();
    
    // close resources and clean up, omitted for brevity's sake
    

    【讨论】:

    • 谢谢。标志选项看起来正是我所需要的。它也适用于插入语句吗?
    • 我的意思是在没有提供值时插入一个默认值。
    • @EliGolin 你可以在values 语句的values 子句中使用case 表达式。
    • 适用于 SQL 案例使用,但在这种情况下,NamedParameterStatement 会比另一种情况更好。在您的示例中,它容易出错
    • @davidhxxx true,但请注意,这不是一个普通的 JDBC 类。它可能不是 OP 的有效解决方案。
    猜你喜欢
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多