Дополнение ALL/ANYответов
Я предпочитаю все решения, которые используют allили anyдля достижения результата, принимая во внимание дополнительные примечания (например, о NULL ). В качестве еще одного дополнения, вот способ подумать об этих операторах.
Вы можете думать о них как об операторах короткого замыкания :
all(array)перебирает все значения в массиве, сравнивая каждое с эталонным значением с помощью предоставленного оператора. Как только сравнение falseзавершается, процесс завершается ложью, в противном случае - истинным. (Сравнимо с логикой короткого замыкания and.)
any(array)перебирает все значения в массиве, сравнивая каждое с эталонным значением с помощью предоставленного оператора. Как только сравнение trueзавершается, процесс завершается истинным, в противном случае - ложным. (Сравнимо с логикой короткого замыкания or.)
Вот почему 3 <> any('{1,2,3}')не дает желаемого результата: процесс сравнивает 3 с 1 на предмет неравенства, что верно, и немедленно возвращает истину. Единственного значения в массиве, отличного от 3, достаточно, чтобы выполнить все условие. Число 3 в последней позиции массива - это вероятность. никогда не использовался.
3 <> all('{1,2,3}')с другой стороны, гарантирует, что все значения не равны 3. Он будет проходить через все сравнения, которые дают true, до элемента, который дает false (последний в этом случае), чтобы вернуть false в качестве общего результата. Это то, чего хочет ОП.
WHERE 3 NOT IN recipient_idsработу?