构建准备好的语句时如何处理可选列

How do I deal with optional columns when constructing a prepared statement

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

P.S 我将 java/scala 与纯 jdbc.

一起使用

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

如果这不是您的用例中的一个选项,您可以构造一个带有 "flag" 的 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