Operador perdido de PostgreSQL cuando se usa un predicado IN con una matriz de cadenas

c# dapper npgsql postgresql

Pregunta

Dada esta estructura de tabla:

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)
);

¿Por qué la siguiente consulta falla con el error?

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

Consulta:

select * from tags where tagname in ('{"c#","c"}'::text[])

Respuesta aceptada

IN debe contener una lista literal, por ejemplo

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

Si quieres una matriz, debes usar = ANY :

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

El error está surgiendo porque tagname IN (somearray) se interpreta como la consulta "is tagname igual a cualquier elemento de la lista de 1 elemento (somearray) ". Eso significa probar tagname para la igualdad contra somearray , el único elemento. Como no hay operador = para comparar text y text[] , esto falla.

Por el contrario, = ANY dice "Para cualquier elemento de la matriz en el lado derecho, ¿el operando de la mano izquierda es igual al elemento?". Entonces funciona



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué