Conciso, rápido (especialmente con muchas filas), mi favorito con respecto a la legibilidad y también funcionaría con engaños:
SELECT count(*) = 1 AND min(val) = 1 FROM foo;
Devuelve TRUE
/ FALSE
.. o NULL
- solo en el caso de exactamente una fila con val IS NULL
, porque count()
nunca devuelve NULL
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:
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
solucionaría esto, pero aún podría fallar con duplicados val
, 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 .
SELECT array_agg(val) = array[1] FROM foo;
Devoluciones TRUE
/ FALSE
/ NULL
.