Prägnant, schnell (besonders bei vielen Zeilen), mein Favorit in Bezug auf Lesbarkeit und würde auch mit Dupes funktionieren:
SELECT count(*) = 1 AND min(val) = 1 FROM foo;
Gibt TRUE
/ FALSE
.. oder NULL
- nur bei genau einer Zeile mit zurück val IS NULL
, da count()
nie NULL
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:
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
würde dies beheben, aber es könnte immer noch mit Duplikaten in fehlschlagen val
- 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 .
SELECT array_agg(val) = array[1] FROM foo;
Rückgabe TRUE
/ FALSE
/ NULL
.