Conciso, rápido (especialmente com muitas linhas), o meu favorito em relação à legibilidade e também funcionaria com dupes:
SELECT count(*) = 1 AND min(val) = 1 FROM foo;
Retorna TRUE
/ FALSE
.. ou NULL
- apenas no caso de exatamente uma linha com val IS NULL
, porque count()
nunca retorna NULL
ou nenhuma linha.
O segundo 1
no exemplo é o mesmo que o primeiro, por causa do seu exemplo.
A consulta na pergunta falha com NULL
valores. Considere a demonstração simples:
CREATE TABLE foo (id int, val int);
INSERT INTO foo VALUES (1, 1),(2, NULL);
SELECT 'yes'
WHERE EXISTS(SELECT * FROM foo WHERE val = 1)
AND NOT EXISTS(SELECT * FROM foo WHERE val <> 1);
IS DISTINCT FROM
corrigiria isso, mas ainda assim poderia falhar com duplicatas val
- as quais você descartou neste caso.
Sua resposta funciona bem.
Retorna 'yes'
/ sem linha.
Eu preferiria essa forma mais curta, no entanto. Não esqueça que o PostgreSQL (ao contrário do Oracle) tem um boolean
tipo apropriado .
SELECT array_agg(val) = array[1] FROM foo;
Retorna TRUE
/ FALSE
/ NULL
.