Conciso, veloce (specialmente con molte righe), il mio preferito in termini di leggibilità e funzionerebbe anche con i duplicati:
SELECT count(*) = 1 AND min(val) = 1 FROM foo;
Restituisce TRUE
/ FALSE
.. o NULL
- solo nel caso di esattamente una riga con val IS NULL
, perché count()
non restituisce mai NULL
o nessuna riga.
Il secondo 1
nell'esempio sembra essere uguale al primo, a causa del tuo esempio.
La query nella domanda ha esito negativo con i NULL
valori. Considera la semplice demo:
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
risolverebbe questo problema, ma potrebbe comunque non riuscire con i duplicati in val
- che hai escluso per questo caso.
La tua risposta funziona bene.
Restituisce 'yes'
/ nessuna riga.
Preferirei questa forma più corta, però. Non dimenticare che PostgreSQL (a differenza di Oracle) ha un boolean
tipo corretto .
SELECT array_agg(val) = array[1] FROM foo;
Restituisce TRUE
/ FALSE
/ NULL
.