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 NULLo nessuna riga.
Il secondo 1nell'esempio sembra essere uguale al primo, a causa del tuo esempio.
La query nella domanda ha esito negativo con i NULLvalori. 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 FROMrisolverebbe 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 booleantipo corretto .
SELECT array_agg(val) = array[1] FROM foo;
Restituisce TRUE/ FALSE/ NULL.