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