Esta seção descreve várias construções especializadas para fazer comparações múltiplas entre grupos de valores. Estas formas são relacionadas sintaticamente com as formas das subconsultas da seção anterior, mas não envolvem subconsultas. As formas envolvendo subexpressões de matrizes são extensões do PostgreSQL; o restante está em conformidade com o padrão SQL. Todas a formas de expressão documentadas nesta seção retornam resultados booleanos (verdade/falso).
expressão IN (valor[, ...])
O lado direito é uma lista de expressões escalares entre parênteses. O resultado é "verdade" se o resultado da expressão à esquerda for igual a qualquer uma das expressões à direita. Esta é uma notação abreviada de
expressão = valor1 OR expressão = valor2 OR ...
Deve ser observado que se o resultado da expressão do lado esquerdo for nulo, ou se não houver valor igual do lado direito e pelo menos uma expressão do lado direito tiver resultado nulo, o resultado da construção IN será nulo, e não falso. Isto está de acordo com as regras normais do SQL para combinações booleanas de valores nulos.
expressão NOT IN (valor[, ...])
O lado direito é uma lista de expressões escalares entre parênteses. O resultado é "verdade" se o resultado da expressão à esquerda for diferente do resultado de todas as expressões à direita. Esta é uma notação abreviada de
expressão <> valor1 AND expressão <> valor2 AND ...
Deve ser observado que se o resultado da expressão do lado esquerdo for nulo, ou se não houver valor igual do lado direito e pelo menos uma expressão do lado direito tiver resultado nulo, o resultado da construção NOT IN será nulo, e não verdade. Isto está de acordo com as regras normais do SQL para combinações booleanas de valores nulos.
Dica: x NOT IN y equivale a NOT (x IN y) para todos os casos. Entretanto, os valores nulos tem muito mais facilidade de confundir uma pessoa inexperiente trabalhando com NOT IN do que trabalhando com IN. É melhor expressar a condição na forma positiva se for possível.
expressão operador ANY (expressão_de_matriz) expressão operador SOME (expressão_de_matriz)
O lado direito é uma expressão entre parênteses, que deve produzir um valor matriz. A expressão do lado esquerdo é processada e comparada com cada elemento da matriz utilizando o operador especificado, que deve produzir um resultado booleano. O resultado de ANY é "verdade" se for obtido algum resultado verdade. O resultado é "falso" se não for obtido nenhum resultado verdade (incluindo o caso especial onde a matriz possui zero elementos).
SOME é sinônimo de ANY.
expressão operador ALL (expressão_de_matriz)
O lado direito é uma expressão entre parênteses, que deve produzir um valor matriz. A expressão do lado esquerdo é processada e comparada com cada elemento da matriz utilizando o operador especificado, que deve produzir um resultado booleano. O resultado de ALL é "verdade" se o resultado de todas as comparações for verdade (incluindo o caso especial onde a matriz possui zero elementos). O resultado é "falso" se for encontrado algum resultado falso.
construtor_de_linha operador construtor_de_linha
Cada um dos lados é um construtor de linha, conforme descrito na Seção 4.2.11. Os valores das duas linhas devem possuir o mesmo número de campos. Cada lado é avaliado e depois comparados por toda a largura da linha. Atualmente, somente são permitidos os operadores = e <> para comparação por toda a largura da linha. O resultado é "verdade" se as duas linhas forem iguais ou diferentes, respectivamente
Da maneira usual, os valores nulos nas linhas são combinados de acordo com com as regras normais para expressões booleana do SQL. As linhas são consideradas iguais se todos os seus membros correspondentes forem não-nulos e iguais; as linhas são diferentes se algum membro correspondente for não-nulo e diferente; senão o resultado da comparação é desconhecido (nulo).
construtor_de_linha IS DISTINCT FROM construtor_de_linha
Esta construção é semelhante à comparação de linha <>, mas não retorna nulo para entradas nulas. Em vez disso, todos os valores nulos são considerados diferentes (distinto de) todos os valores não-nulos, e dois valores nulos são considerados iguais (não distintos). Portanto, o resultado será sempre verdade ou falso, e nunca nulo.
construtor_de_linha IS NULL construtor_de_linha IS NOT NULL
Estas construções testam um valor de linha para nulo e não nulo. Um valor de linha é considerado não-nulo se tiver pelo menos um campo que não seja nulo.