Java 仅当值为非空时更新列

Java 仅当值为非空时更新列,java,postgresql,jdbc,Java,Postgresql,Jdbc,考虑以下PL/pgSQL过程: DO $$ DECLARE _notes VARCHAR := 'something'; _id BIGINT := 11683; BEGIN update person set notes = CASE WHEN LENGTH(_notes) = 0 THEN notes ELSE _notes END WHERE id = _id; END $$ 目标是仅当\u notes变量不是空字符串时才更新notes列。本例有效,但UPDATE

考虑以下PL/pgSQL过程:

DO
$$
DECLARE
    _notes VARCHAR := 'something';
    _id BIGINT := 11683;
BEGIN
    update person set notes = CASE WHEN LENGTH(_notes) = 0 THEN notes ELSE _notes END WHERE id = _id;
END
$$
目标是仅当\u notes变量不是空字符串时才更新notes列。本例有效,但UPDATE语句中使用了两次变量。我想知道是否有一种方法可以只使用它一次(而不用编写自定义数据库函数)

我需要这个的原因是什么?我正在编写一个Java类,它自动将POJO写入数据库。某些字段只能在非空时标记为保存。由于JDBC只支持位置参数,所以在现有的解决方案中,我需要指定相同的参数两次,这与我的代码的其余部分不一致

附带问题:如果值为空,则update语句实质上是:
update person SET notes=notes
。在这种情况下,PostgreSQL是否足够聪明,不会进行任何实际更新

编辑

显然,这是不可能的。唯一的方法是编写自定义PL/pgSQL函数,大致如下:

CREATE OR REPLACE FUNCTION coalesce_empty(varchar, varchar) RETURNS varchar AS $$
    SELECT CASE WHEN LENGTH($1) = 0 THEN $2 ELSE $1 END;
$$ LANGUAGE sql IMMUTABLE;

但这需要完全控制数据库。

为什么不检查Java代码中的
notes
是否为空,并仅在这种情况下运行
UPDATE
?“PostgreSQL是否足够聪明,在这种情况下不会进行任何实际更新”-Postgres将按照您的指示执行。如果您告诉它用一个值更新列,它就会这样做。@MickMnemonic这是一个简化的示例。同一语句中还有其他字段正在更新。当notes字段为空时,我可以修改SQL,但这会阻止我在批处理中使用该语句。@a_horse_,带_no_name,OK。但是,如果您告诉它使用从同一列读取的值更新一列,很明显,写入该值是不必要的。众所周知,数据库在可能的情况下会进行优化,所以我认为这可能是其中之一。