Ich habe Folgendes geschrieben:
select 'yes'
where exists(select * from foo where val=1)
and not exists(select * from foo where val<>1);
und sich fragen, ob es einen prägnanteren Weg gibt, ohne zu viel Lesbarkeit zu beeinträchtigen.
Ich habe einen Weg gefunden, den ich als Antwort poste, bin aber nicht ganz zufrieden damit und würde mich sehr für Alternativen interessieren
In diesem Fall val
ist innerhalb eindeutig foo
- es gibt keine Duplikate
postgresql
duplication
Jack sagt, versuchen Sie es mit topanswers.xyz
quelle
quelle
count(distinct val)
, obwohl es in meinem realen Fall keinen Unterschied machtAntworten:
Prägnant, schnell (besonders bei vielen Zeilen), mein Favorit in Bezug auf Lesbarkeit und würde auch mit Dupes funktionieren:
Gibt
TRUE
/FALSE
.. oderNULL
- nur bei genau einer Zeile mit zurückval IS NULL
, dacount()
nieNULL
oder keine Zeile zurückgegeben wird.Die zweite
1
im Beispiel ist aufgrund Ihres Beispiels zufällig dieselbe wie die erste.Die Abfrage in der Frage schlägt mit
NULL
Werten fehl . Betrachten Sie die einfache Demo:IS DISTINCT FROM
würde dies beheben, aber es könnte immer noch mit Duplikaten in fehlschlagenval
- was Sie für diesen Fall ausgeschlossen haben.Ihre Antwort funktioniert gut.
Rückgabe
'yes'
/ keine Zeile.Ich würde diese kürzere Form jedoch bevorzugen. Vergessen Sie nicht, dass PostgreSQL (im Gegensatz zu Oracle) einen geeigneten
boolean
Typ hat .Rückgabe
TRUE
/FALSE
/NULL
.quelle
Eine Variation von @ Erwins Antwort. Nein
COUNT()
, nurMIN()
undMAX()
. Bei großen Tischen und (in Ihrem Fall nicht) Duplikaten ist dies möglicherweise etwas effizienterval
:quelle
quelle
Diese kehrt man
true
,false
oder ein leeres Ergebnis:quelle
false
wenn es Werte infoo
wo gibtval<>1
?NULL
Wert, der in diesem Fall nicht ausgeschlossen wurde.NULL
kann mitIS [NOT] DISTINCT FROM
meiner Meinung nach ausgearbeitet werden .LEFT JOIN foo j ON j.val <> foo.val
erkennt eine Zeile mitj.val IS NULL
zunächst nicht. Wenn Sie esON j.val IS DISTINCT FROM foo.val
hinzufügen möchten, müssen Sie eine anderej
definierte Spalte überprüfenNOT NULL
, um die beiden Fälle voneinander zu unterscheiden. Es ist jedoch keine zusätzliche Spalte definiert.