Me encontré escribiendo lo siguiente:
select 'yes'
where exists(select * from foo where val=1)
and not exists(select * from foo where val<>1);
y preguntándome si hay una forma más concisa sin sacrificar demasiada legibilidad.
Encontré una forma en la que estoy publicando como respuesta, pero no estoy del todo contento y me interesarían mucho las alternativas.
En este caso val
es único en el interior foo
: no hay duplicados
postgresql
duplication
Jack dice que intente topanswers.xyz
fuente
fuente
count(distinct val)
, aunque en mi caso del mundo real no hay diferenciaRespuestas:
Conciso, rápido (especialmente con muchas filas), mi favorito con respecto a la legibilidad y también funcionaría con engaños:
Devuelve
TRUE
/FALSE
.. oNULL
- solo en el caso de exactamente una fila conval IS NULL
, porquecount()
nunca devuelveNULL
o no hay fila.El segundo
1
en el ejemplo resulta ser el mismo que el primero, debido a su ejemplo.La consulta en la pregunta falla con los
NULL
valores. Considere la demostración simple:IS DISTINCT FROM
solucionaría esto, pero aún podría fallar con duplicadosval
, lo que ha descartado para este caso.Tu respuesta funciona bien.
Devoluciones
'yes'
/ sin fila.Sin embargo, preferiría esta forma más corta. No olvide que PostgreSQL (a diferencia de Oracle) tiene un
boolean
tipo adecuado .Devoluciones
TRUE
/FALSE
/NULL
.fuente
Una variación de la respuesta de @ Erwin. No
COUNT()
en absoluto, soloMIN()
yMAX()
. Puede ser un poco más eficiente con una tabla grande y (no en su caso) duplicarval
:fuente
fuente
Este regresa
true
,false
o un resultado vacío:fuente
false
si hay valores enfoo
dóndeval<>1
?NULL
valor que no se ha descartado en este caso.NULL
se puede resolver usandoIS [NOT] DISTINCT FROM
Creo.LEFT JOIN foo j ON j.val <> foo.val
no puede detectar una fila conj.val IS NULL
para empezar. Si lo incluye conON j.val IS DISTINCT FROM foo.val
, entonces debería verificar en otra columna dej
definidoNOT NULL
para distinguir los dos casos. Pero no se define una columna adicional.