Eu me vi escrevendo o seguinte:
select 'yes'
where exists(select * from foo where val=1)
and not exists(select * from foo where val<>1);
e me perguntando 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
Nesse caso, val
é único dentro foo
- não há duplicatas
postgresql
duplication
Jack diz que tenta topanswers.xyz
fonte
fonte
count(distinct val)
, embora no meu caso do mundo real não faça diferençaRespostas:
Conciso, rápido (especialmente com muitas linhas), o meu favorito em relação à legibilidade e também funcionaria com dupes:
Retorna
TRUE
/FALSE
.. ouNULL
- apenas 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 assim poderia falhar com duplicatasval
- 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 .Retorna
TRUE
/FALSE
/NULL
.fonte
Uma variação na resposta de @ Erwin. Não
COUNT()
, apenasMIN()
eMAX()
. Pode ser um pouco mais eficiente com tabela grande e (não no seu caso) duplicadaval
:fonte
fonte
Este retorna
true
,false
ou um resultado vazio:fonte
false
se houver valores emfoo
ondeval<>1
?NULL
valor que não foi descartado neste caso.NULL
pode ser resolvido usandoIS [NOT] DISTINCT FROM
eu acho.LEFT JOIN foo j ON j.val <> foo.val
falha ao detectar uma linhaj.val IS NULL
no início. Se você incluí-ON j.val IS DISTINCT FROM foo.val
lo, precisará verificar outra coluna dej
definidoNOT NULL
para diferenciar os dois casos. Mas nenhuma coluna adicional está definida.