Лаконічний, швидкий (особливо з багатьма рядами), мій фаворит, що стосується читабельності, а також працював би з дупами:
SELECT count(*) = 1 AND min(val) = 1 FROM foo;
Повертає TRUE
/ FALSE
.. або NULL
- лише у випадку, якщо рівно один рядок з val IS NULL
, тому що count()
ніколи не повертає NULL
чи не містить рядка.
Другий 1
у прикладі просто трапляється таким же, як і перший, через ваш приклад.
Запит у питанні не відповідає NULL
значень. Розглянемо просту демонстрацію:
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
це виправить це, але воно все-таки може вийти з ладу в дублікатах, val
які ви виключили для цього випадку.
Ваша відповідь справно працює.
Повернення 'yes'
/ немає рядка
Я хотів би віддати перевагу цій коротшій формі. Не забувайте, що PostgreSQL (на відміну від Oracle) має належний boolean
тип .
SELECT array_agg(val) = array[1] FROM foo;
Повернення TRUE
/ FALSE
/ NULL
.