Rozszerzanie ALL/ANY
odpowiedzi
Preferuję wszystkie rozwiązania, które wykorzystują all
lub any
osiągają wynik, ceniąc sobie dodatkowe uwagi (np. O NULL- ach). Jako kolejne ulepszenie, oto sposób myślenia o tych operatorach.
Można o nich myśleć jako o operatorach zwarć :
all(array)
przechodzi przez wszystkie wartości w tablicy, porównując każdą z wartością odniesienia przy użyciu podanego operatora. Gdy tylko wyniki porównania wypadną false
, proces kończy się błędem, w przeciwnym razie prawdą. (Porównywalne z logiką zwarciową and
.)
any(array)
przechodzi przez wszystkie wartości w tablicy, porównując każdą z wartością odniesienia przy użyciu podanego operatora. Gdy tylko wynik porównania true
zakończy się, proces kończy się na prawdzie, w przeciwnym razie na fałszu. (Porównywalne z logiką zwarciową or
.)
Dlatego 3 <> any('{1,2,3}')
nie daje pożądanego wyniku: proces porównuje 3 z 1 pod względem nierówności, co jest prawdą, i natychmiast zwraca prawdę. Pojedyncza wartość w tablicy różna od 3 wystarczy, aby spełnić cały warunek. 3 na ostatniej pozycji tablicy to prawdop. nigdy nie używany.
3 <> all('{1,2,3}')
z drugiej strony upewnia się, że wszystkie wartości nie są równe 3. Przeszedł przez wszystkie porównania, które dały prawdę, aż do elementu, który daje fałsz (ostatni w tym przypadku), aby zwrócić false jako wynik ogólny. Tego właśnie chce PO.
WHERE 3 NOT IN recipient_ids
działa?