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