Aumentando as ALL/ANYrespostas
Prefiro todas as soluções que usam allou anyque alcancem o resultado, valorizando as notas adicionais (por exemplo, sobre NULL s). Como outro acréscimo, aqui está uma maneira de pensar sobre esses operadores.
Você pode pensar neles como operadores de curto-circuito :
all(array)passa por todos os valores na matriz, comparando cada um com o valor de referência usando o operador fornecido. Assim que uma comparação resulta false, o processo termina com falso, caso contrário, verdadeiro. (Comparável ao lógico de curto-circuito and.)
any(array)passa por todos os valores na matriz, comparando cada um com o valor de referência usando o operador fornecido. Assim que uma comparação resulta true, o processo termina com verdadeiro, caso contrário, falso. (Comparável ao lógico de curto-circuito or.)
É por isso 3 <> any('{1,2,3}')que não produz o resultado desejado: o processo compara 3 com 1 para a desigualdade, o que é verdadeiro, e retorna imediatamente verdadeiro. Um único valor na matriz diferente de 3 é suficiente para tornar toda a condição verdadeira. O 3 na última posição da matriz é prob. nunca usado.
3 <> all('{1,2,3}')por outro lado, garante que todos os valores não sejam iguais a 3. Ele percorrerá todas as comparações que resultam em verdadeiro até um elemento que produz falso (o último neste caso), para retornar falso como o resultado geral. É isso que o OP deseja.
WHERE 3 NOT IN recipient_idso trabalho?