Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在构造准备好的语句时,如何处理可选列_Java_Database_Postgresql_Jdbc_Prepared Statement - Fatal编程技术网

Java 在构造准备好的语句时,如何处理可选列

Java 在构造准备好的语句时,如何处理可选列,java,database,postgresql,jdbc,prepared-statement,Java,Database,Postgresql,Jdbc,Prepared Statement,我想利用准备好的语句插入/更新postgres db。 问题是,该表包含可为空的列,我在运行时可能有值,也可能没有值。 如果我没有要插入/更新的内容,我需要保留旧值。 有没有一种语法可以用于这种情况? 在这种情况下,最好的做法是什么?这似乎是一个非常常见的问题 附言 我将java/scala与普通jdbc结合使用。当然,您可以只构造一个语句,而不包含您不想更新的列 如果这不是用例中的选项,那么您可以构造一个带有“标志”的case表达式,以指示是否应该绑定列 例如: 谢谢flag选项看起来正是我所

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

附言
我将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