Aumentando as ALL/ANY
respostas
Prefiro todas as soluções que usam all
ou any
que 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_ids
o trabalho?