Me peguei escrevendo o seguinte:
select 'yes'
where exists(select * from foo where val=1)
and not exists(select * from foo where val<>1);
e imaginando se existe uma maneira mais concisa sem sacrificar muita legibilidade.
Eu encontrei uma maneira que estou postando como resposta, mas não estou totalmente feliz com isso e estaria muito interessado em alternativas
Neste caso, val
é único dentro foo
- não há duplicatas
Conciso, rápido (especialmente com muitas linhas), meu favorito em relação à legibilidade e também funcionaria com dupes:
Retorna
TRUE
/FALSE
.. ouNULL
- somente no caso de exatamente uma linha comval IS NULL
, porquecount()
nunca retornaNULL
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:IS DISTINCT FROM
corrigiria isso, mas ainda poderia falhar com duplicatasval
- o que você descartou para este caso.Sua resposta funciona bem.
Retorna
'yes'
/ sem linha.Eu preferiria esta forma mais curta, no entanto. Não esqueça que o PostgreSQL (ao contrário do Oracle) tem um
boolean
tipo adequado .Retorna
TRUE
/FALSE
/NULL
.Uma variação da resposta de @Erwin. Não
COUNT()
, apenasMIN()
eMAX()
. Pode ser um pouco mais eficiente com uma tabela grande e (não no seu caso) duplicarval
:Este retorna
true
,false
ou um resultado vazio: