Zwięzły, szybki (szczególnie z wieloma wierszami), mój ulubiony pod względem czytelności i działałby również z duplikatami:
SELECT count(*) = 1 AND min(val) = 1 FROM foo;
Zwraca TRUE/ FALSE.. lub NULL- tylko w przypadku dokładnie jednego wiersza z val IS NULL, ponieważ count()nigdy nie zwraca NULLlub nie ma wiersza.
Drugi 1w przykładzie po prostu jest taki sam jak pierwszy, z powodu twojego przykładu.
Zapytanie w pytaniu kończy się niepowodzeniem z NULLwartościami. Rozważ proste 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 FROMnaprawiłoby to, ale nadal może się nie powieść z duplikatami w val- co wykluczyłeś w tym przypadku.
Twoja odpowiedź działa dobrze.
Zwraca 'yes'/ brak wiersza.
Wolałbym jednak tę krótszą formę. Nie zapominaj, że PostgreSQL (w przeciwieństwie do Oracle) ma odpowiedni booleantyp .
SELECT array_agg(val) = array[1] FROM foo;
Zwraca TRUE/ FALSE/ NULL.