Je me suis retrouvé à écrire ce qui suit:
select 'yes'
where exists(select * from foo where val=1)
and not exists(select * from foo where val<>1);
et se demander s'il existe un moyen plus concis sans sacrifier trop de lisibilité.
J'ai trouvé un moyen que je poste comme réponse mais je ne suis pas entièrement satisfait et je serais très intéressé par les alternatives
Dans ce cas val
est unique à l'intérieur foo
- il n'y a pas de doublons
postgresql
duplication
Jack dit d'essayer topanswers.xyz
la source
la source
count(distinct val)
, bien que dans mon cas réel cela ne fasse aucune différenceRéponses:
Concis, rapide (surtout avec de nombreuses lignes), mon préféré concernant la lisibilité et fonctionnerait aussi avec les dupes:
Renvoie
TRUE
/FALSE
.. ouNULL
- uniquement dans le cas d'exactement une ligne avecval IS NULL
, carcount()
ne renvoie jamaisNULL
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:IS DISTINCT FROM
pourrait résoudre ce problème, mais il pourrait toujours échouer avec des doublons dansval
- 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é .Renvoie
TRUE
/FALSE
/NULL
.la source
Une variation sur la réponse de @ Erwin. Non
COUNT()
du tout, seulementMIN()
etMAX()
. Il peut être légèrement plus efficace avec une grande table et (pas dans votre cas) en doubleval
:la source
la source
Celui-ci renvoie
true
,false
ou un résultat vide:la source
false
s'il y a des valeurs dansfoo
oùval<>1
?NULL
valeur qui n'a pas été exclue dans ce cas.NULL
peut être élaboré en utilisantIS [NOT] DISTINCT FROM
Je pense.LEFT JOIN foo j ON j.val <> foo.val
ne parvient pas à détecter une ligne avecj.val IS NULL
pour commencer. Si vous l'incluez avecON j.val IS DISTINCT FROM foo.val
vous, vous devrez alors vérifier sur une autre colonne dej
définiNOT NULL
pour distinguer les deux cas. Mais aucune colonne supplémentaire n'est définie.