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 NULLoder keine Zeile zurückgegeben wird.
Die zweite 1im Beispiel ist aufgrund Ihres Beispiels zufällig dieselbe wie die erste.
Die Abfrage in der Frage schlägt mit NULLWerten 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 FROMwü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 booleanTyp hat .
SELECT array_agg(val) = array[1] FROM foo;
Rückgabe TRUE/ FALSE/ NULL.