Saltar al contenido

Postgres NO en array

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ón falseel proceso termina con falsede lo contrario true. (Comparable a cortocircuito lógico and.)
  • 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ón trueel proceso termina con truede lo contrario false. (Comparable a cortocircuito lógico or.)

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *