PostgreSQL missing operator when using IN predicate with string array

c# dapper npgsql postgresql

Question

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[])

Accepted Answer

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.



Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Is this KB legal? Yes, learn why
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Is this KB legal? Yes, learn why