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 NULL
ou aucune ligne.
Le second 1
de l'exemple se trouve être le même que le premier, à cause de votre exemple.
La requête dans la question échoue avec des NULL
valeurs. 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 FROM
pourrait 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 boolean
type approprié .
SELECT array_agg(val) = array[1] FROM foo;
Renvoie TRUE
/ FALSE
/ NULL
.