Reputation: 6842
I'm trying to update a row in a postgres table. I want to toggle a boolean field.
Instead of first checking what the value is and updating the field with the opposite, I was wondering if there was a single query to update the field.
I found a solution for MySQL, but its not working for postgres:
UPDATE table SET boolean_field = !boolean_field WHERE id = :id
Error: Operator does not exist. ! boolean
Is there an similar syntax in postgres?
Upvotes: 24
Views: 27860
Reputation: 61
UPDATE table_name
SET bool_col = NOT(COALESCE(bool_col, FALSE))
WHERE ...
Upvotes: 6
Reputation: 127406
Use NOT:
UPDATE table SET boolean_field = NOT boolean_field WHERE id = :id
When the old value equals FALSE then it turns into TRUE and visa versa. A NULL field won't flip, there is nothing to flip to.
Complete example:
CREATE TABLE test(id serial, boolean_field boolean);
INSERT INTO test(boolean_field)
VALUES(null),(false), (true)
RETURNING *;
AND run the test:
UPDATE test
SET boolean_field = NOT boolean_field
RETURNING *;
Upvotes: 44