I have a table t
with several columns, let's name them a
, b
and c
. I also have a state
column which indicates the current state. There is also an id
column.
I want to write the following query: update column a
always, but b
and c
only if the application state
is still equal to the database state
. Here, the state
column is used for optimistic locking.
I wrote this query as following:
UPDATE t
SET a = $a$,
b = (CASE WHEN state = $state$ THEN $b$ ELSE b END),
c = (CASE WHEN state = $state$ THEN $c$ ELSE c END)
WHERE id = $id$ AND
(
a != $a$ OR
b != (CASE WHEN state = $state$ THEN $b$ ELSE b END) OR
c != (CASE WHEN state = $state$ THEN $c$ ELSE c END)
)
Here, $id$
, $a$
, ... are input variables from the application. The second part of the WHERE
clause is to avoid updates which do not effectively update anything.
This query works as expected, but is very clumsy. I am repeating the same condition several times. I am looking for a way to rewrite this query in a more elegant fashion. If this was a simple SELECT
query, I could do something with a LATERAL JOIN
, but I cannot see how to apply this here.
How can I improve this query?