Предполагая, что все значения, которые вы хотите установить, не равны NULL, вы можете использовать оператор типа
update sometable set column1 = coalesce(?, column1), colum2 = coalesce(?, column2)
Тогда, когда значение не нужно обновлять, используйте либо PreparedStatement.setNull
с соответствующим java.sql.Types
значение или PreparedStatement.setXXX
соответствующего типа с null
в качестве значения.
Как обсуждалось в комментариях, альтернативой, если вам нужно обновить до null
, является использование пользовательской функциисо значением Sentinel (либо для обновления до нуля, либо для использования текущего значения). Что-то вроде:
update sometable set column1 = conditional_update(?, column1), colum2 = conditional_update(?, column2)
Где conditional_update
будет что-то вроде (с использованием синтаксиса Firebird 3 PSQL):
create function conditional_update(new_value varchar(500), original_value varchar(500))
returns varchar(500)
as
begin
if (new_value = '$$NO_UPDATE$$') then
return original_value;
else
return new_value;
end
Где использование $$NO_UPDATE$$
- это значение стража для отсутствия обновления. Потенциальным недостатком этого решения является ввод столбцов в виде строкового типа. Вам всегда нужно использовать строковые типы (я не уверен, существуют ли базы данных, которые бы поддерживали динамические параметры и возвращаемые типы в этой ситуации).