4

I have some columns in PostgreSQL database that are array. I want to add a new value (in UPDATE) in it if the value don't exists, otherwise, don't add anytihing. I don't want to overwrite the current value of the array, but only add the element to it.

Is possible do this in a query or I need to do this inside a function? I'm using PostgreSQL.

Renato Dinhani
  • 35,057
  • 55
  • 139
  • 199

1 Answers1

11

This should be as simple as this example for an integer array (integer[]):

UPDATE tbl SET col = col || 5
WHERE  (5 = ANY(col)) IS NOT TRUE;

A WHERE clause like:

WHERE  5 <> ALL(col)

would also catch the case of an empty array '{}'::int[], but fail if a NULL value appears as element of the array.

If your arrays never contain NULL as element, consider actual array operators, possibly supported by a GIN index.

UPDATE tbl SET col = col || 5
WHERE  NOT col @> '{5}';

See:

Erwin Brandstetter
  • 605,456
  • 145
  • 1,078
  • 1,228
  • `UPDATE token SET grammar = grammar || 'JUNCTION' WHERE ('JUNCTION' = ANY(grammar)) IS NOT TRUE;`. This is the SQL modified for my case, but if fails in the `grammar || 'JUNCTION'`. The type of array is `VARCHAR`. – Renato Dinhani Nov 12 '11 at 04:03
  • 1
    Thanks, worked, but a conversion is needed to varchar. `...grammar = grammar || 'JUNCTION'::VARCHAR`. – Renato Dinhani Nov 12 '11 at 04:10