Дополнение 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
работу?