Краткий, быстрый (особенно со многими строками), мой любимый в отношении читабельности и будет работать с дупсами:
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
.