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 vales ú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 devuelveNULLo no hay fila.El segundo
1en el ejemplo resulta ser el mismo que el primero, debido a su ejemplo.La consulta en la pregunta falla con los
NULLvalores. Considere la demostración simple:IS DISTINCT FROMsolucionarí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
booleantipo 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,falseo un resultado vacío:fuente
falsesi hay valores enfoodóndeval<>1?NULLvalor que no se ha descartado en este caso.NULLse puede resolver usandoIS [NOT] DISTINCT FROMCreo.LEFT JOIN foo j ON j.val <> foo.valno puede detectar una fila conj.val IS NULLpara empezar. Si lo incluye conON j.val IS DISTINCT FROM foo.val, entonces debería verificar en otra columna dejdefinidoNOT NULLpara distinguir los dos casos. Pero no se define una columna adicional.