Augmenter les ALL/ANY
réponses
Je préfère toutes les solutions qui utilisent all
ou any
pour obtenir le résultat, en appréciant les notes supplémentaires (par exemple à propos des NULL ). Comme autre augmentation, voici une façon de penser à ces opérateurs.
Vous pouvez les considérer comme des opérateurs de court-circuit :
all(array)
parcourt toutes les valeurs du tableau, en les comparant à la valeur de référence à l'aide de l'opérateur fourni. Dès qu'une comparaison aboutit false
, le processus se termine par false, sinon true. (Comparable à la logique de court-circuit and
.)
any(array)
parcourt toutes les valeurs du tableau, en les comparant à la valeur de référence à l'aide de l'opérateur fourni. Dès qu'une comparaison aboutit true
, le processus se termine par vrai, sinon faux. (Comparable à la logique de court-circuit or
.)
C'est pourquoi 3 <> any('{1,2,3}')
ne donne pas le résultat souhaité: le processus compare 3 à 1 pour l'inégalité, ce qui est vrai, et renvoie immédiatement vrai. Une seule valeur du tableau différente de 3 suffit pour que la condition entière soit vraie. Le 3 dans la dernière position du tableau est prob. jamais utilisé.
3 <> all('{1,2,3}')
d'autre part s'assure que toutes les valeurs ne sont pas égales à 3. Il exécutera toutes les comparaisons qui donnent vrai jusqu'à un élément qui donne faux (le dernier dans ce cas), pour retourner faux comme résultat global. C'est ce que veut l'OP.
WHERE 3 NOT IN recipient_ids
marche?