web-dev-qa-db-fra.com

Une requête PostgreSQL avec 'ANY' ne fonctionne pas

SELECT "Ticket_id"  FROM "Tickets"
 WHERE "Status" = 1 AND ("Ticket_id" !=  ANY(array[1,2,3])) Limit 6

Et le résultat est 1,2,3,4,5,6

31
Bogo

Vous voulez utiliser ALL, pas ANY. Du manuel fin :

9.21.3. TOUT/QUELQUES (tableau)

expression operator ANY (array expression)

[...] L'expression de gauche est évaluée et comparée à chaque élément du tableau en utilisant l'opérateur donné , qui doit donner un résultat booléen. Le résultat de ANY est "vrai" si un résultat vrai est obtenu.

Donc, si nous disons ceci:

1 != any(array[1,2])

alors nous deviendrons vrais depuis (1 != 1) or (1 != 2) est vrai. ANY est essentiellement un opérateur OR. Par exemple:

=> select id from (values (1),(2),(3)) as t(id) where id != any(array[1,2]);
 id 
----
  1
  2
  3
(3 rows)

Si nous regardons ALL, nous voyons :

9.21.4. TOUS (tableau)

expression operator ALL (array expression)

[...] L'expression de gauche est évaluée et comparée à chaque élément du tableau en utilisant l'opérateur donné , qui doit donner un résultat booléen. Le résultat de ALL est "vrai" si toutes les comparaisons produisent vrai ...

donc si on dit ça:

1 != all(array[1,2])

alors nous deviendrons faux puisque (1 != 1) and (1 != 2) est faux et nous voyons que ALL est essentiellement un opérateur AND. Par exemple:

=> select id from (values (1),(2),(3)) as t(id) where id != all(array[1,2]);
 id 
----
  3
(1 row)

Si vous souhaitez exclure toutes les valeurs d'un tableau, utilisez ALL:

select "Ticket_id"
from "Tickets"
where "Status" = 1
  and "Ticket_id" != all(array[1,2,3])
limit 6
65
mu is too short

Tu veux dire:

"Ticked_id" NOT IN (1,2,3)
6
Bilal Akil