Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PostgreSQL missing operator when using IN predicate with string array

Given this table structure:

CREATE TABLE tags
(
  id SERIAL NOT NULL PRIMARY KEY,
  tagname TEXT NOT NULL UNIQUE,
  authorid int NOT NULL,
  created timestamp NOT NULL,
  lastmodified timestamp NOT NULL,

  constraint fk_authorid_tags foreign key(authorid) references users(id)
);

Why does the following query fails with the error:

ERROR:  operator does not exist: text = text[]
LINE 2: select * from tags where tagname in ('{"c#","c"}'::text[])

Query:

select * from tags where tagname in ('{"c#","c"}'::text[])
like image 337
Oliver Weichhold Avatar asked Mar 07 '26 20:03

Oliver Weichhold


1 Answers

IN must contain a literal list, e.g.

tagname IN ('c#', 'c')

If you want an array, you must use = ANY:

tagname = ANY (ARRAY['c#', 'c'])

The error is arising because tagname IN (somearray) is interpreted as the query "is tagname equal to any element of the the 1-element list (somearray)". That means testing tagname for equality against somearray, the only element. As there's no = operator to compare text and text[], this fails.

By contrast, = ANY says "For any element of the array on the right hand side, is the left hand operand equal to the element?". So it works.

like image 124
Craig Ringer Avatar answered Mar 10 '26 09:03

Craig Ringer