构建准备好的语句时如何处理可选列
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
我想利用准备好的语句来 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