Concis, rapide (surtout avec de nombreuses lignes), mon préféré concernant la lisibilité et fonctionnerait aussi avec les dupes:
SELECT count(*) = 1 AND min(val) = 1 FROM foo;
Renvoie TRUE/ FALSE.. ou NULL- uniquement dans le cas d'exactement une ligne avec val IS NULL, car count()ne renvoie jamais NULLou aucune ligne.
Le second 1de l'exemple se trouve être le même que le premier, à cause de votre exemple.
La requête dans la question échoue avec des NULLvaleurs. Considérez la démonstration 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 FROMpourrait résoudre ce problème, mais il pourrait toujours échouer avec des doublons dans val- ce que vous avez exclu dans ce cas.
Votre réponse fonctionne bien.
Renvoie 'yes'/ aucune ligne.
Je préférerais cependant cette forme plus courte. N'oubliez pas que PostgreSQL (contrairement à Oracle) a un booleantype approprié .
SELECT array_agg(val) = array[1] FROM foo;
Renvoie TRUE/ FALSE/ NULL.