Mantén la atención porque en este artículo encontrarás la respuesta que buscas.
Solución:
SELECT COUNT(*) FROM "messages" WHERE NOT (3 = ANY (recipient_ids))
Siempre puedes negar WHERE (condition)
con WHERE NOT (condition)
Podría darle la vuelta un poco y decir “3 no es igual a todas las ID”:
where 3 != all (recipient_ids)
Del buen manual:
9.21.4. TODOS (array)
expression operator ALL (array expression)
El lado derecho es una expresión entre paréntesis, que debe producir un array valor. La expresión de la izquierda se evalúa y compara con cada elemento de la array usando lo dado operador, que debe producir un resultado booleano. El resultado de
ALL
es “true”si todas las comparaciones dan true (incluido el caso en que el array tiene cero elementos). El resultado es “false” Si alguna false se encuentra el resultado.
Aumentando el ALL/ANY
respuestas
Prefiero todas las soluciones que usan all
o any
para lograr el resultado, apreciando las notas adicionales (por ejemplo, sobre NULOs). Como otro aumento, aquí hay una forma de pensar en esos operadores.
Puedes pensar en ellos como operadores de cortocircuito:
all(array)
pasa por todos los valores de la array, comparando cada uno con el valor de referencia utilizando el operador proporcionado. Tan pronto como los rendimientos de una comparaciónfalse
el proceso termina con falsede lo contrario true. (Comparable a cortocircuito lógicoand
.)any(array)
pasa por todos los valores de la array, comparando cada uno con el valor de referencia utilizando el operador proporcionado. Tan pronto como los rendimientos de una comparacióntrue
el proceso termina con truede lo contrario false. (Comparable a cortocircuito lógicoor
.)
Esta es la razón por 3 <> any('1,2,3')
no produce el resultado deseado: el proceso compara 3 con 1 para la desigualdad, que es truee inmediatamente regresa true. Un solo valor en el array diferente de 3 es suficiente para hacer la condición completa true. Los 3 en el ultimo array la posición es prob. nunca usado.
3 <> all('1,2,3')
por otro lado se asegura todos los valores no son iguales 3. Ejecutará todas las comparaciones que produzcan true hasta un elemento que produce false (el último en este caso), para volver false como resultado global. Esto es lo que quiere el OP.