Java 在构造准备好的语句时,如何处理可选列
我想利用准备好的语句插入/更新postgres db。 问题是,该表包含可为空的列,我在运行时可能有值,也可能没有值。Java 在构造准备好的语句时,如何处理可选列,java,database,postgresql,jdbc,prepared-statement,Java,Database,Postgresql,Jdbc,Prepared Statement,我想利用准备好的语句插入/更新postgres db。 问题是,该表包含可为空的列,我在运行时可能有值,也可能没有值。 如果我没有要插入/更新的内容,我需要保留旧值。 有没有一种语法可以用于这种情况? 在这种情况下,最好的做法是什么?这似乎是一个非常常见的问题 附言 我将java/scala与普通jdbc结合使用。当然,您可以只构造一个语句,而不包含您不想更新的列 如果这不是用例中的选项,那么您可以构造一个带有“标志”的case表达式,以指示是否应该绑定列 例如: 谢谢flag选项看起来正是我所
如果我没有要插入/更新的内容,我需要保留旧值。
有没有一种语法可以用于这种情况?
在这种情况下,最好的做法是什么?这似乎是一个非常常见的问题 附言
我将java/scala与普通jdbc结合使用。当然,您可以只构造一个语句,而不包含您不想更新的列 如果这不是用例中的选项,那么您可以构造一个带有“标志”的case表达式,以指示是否应该绑定列 例如:
谢谢flag选项看起来正是我所需要的。它也适用于insert语句吗?我的意思是在没有提供值的情况下插入一个默认值。@EliGolin您可以在
insert
语句的values
子句中使用case
表达式。对于SQL case用法很好,但在这种情况下,与另一种情况相比,NamedParameterStatement会更好。在您的示例中,这是错误的prone@davidhxxx是的,但请注意,这不是一个普通的JDBC类。它可能不是OP的有效解决方案。
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