Я обнаружил, что пишу следующее:
select 'yes'
where exists(select * from foo where val=1)
and not exists(select * from foo where val<>1);
и интересно, есть ли более краткий способ, не жертвуя слишком большой читабельностью.
Я нашел один способ, который я публикую в качестве ответа, но я не совсем доволен им и был бы очень заинтересован в альтернативах
В этом случае val
уникален внутри foo
- дубликатов нет
postgresql
duplication
Джек говорит, попробуйте topanswers.xyz
источник
источник
count(distinct val)
, хотя в моем случае из реальной жизни это не имеет значенияОтветы:
Краткий, быстрый (особенно со многими строками), мой любимый в отношении читабельности и будет работать с дупсами:
Возвращает
TRUE
/FALSE
.. илиNULL
- только в случае ровно одной строки сval IS NULL
, потому чтоcount()
никогда не возвращаетNULL
или нет строки.Второе
1
в этом примере просто совпадает с первым из-за вашего примера.Запрос в вопросе терпит неудачу со
NULL
значениями. Рассмотрим простую демонстрацию:IS DISTINCT FROM
бы исправить это, но он все равно может потерпеть неудачу с дубликатами вval
- что вы исключили для этого случая.Ваш ответ работает отлично.
Возвращает
'yes'
/ нет строки.Я бы предпочел эту более короткую форму. Не забывайте, что PostgreSQL (в отличие от Oracle) имеет правильный
boolean
тип .Возврат
TRUE
/FALSE
/NULL
.источник
Вариант ответа @ Эрвина. Нет
COUNT()
вообще, толькоMIN()
иMAX()
. Это может быть немного более эффективно с большой таблицей и (не в вашем случае) дублироватьval
:источник
источник
Это один возвращается
true
,false
или пустой результат:источник
false
если есть значенияfoo
гдеval<>1
?NULL
как со значением, которое не было исключено в этом случае.NULL
может быть решен с использованием,IS [NOT] DISTINCT FROM
я думаю.LEFT JOIN foo j ON j.val <> foo.val
не может обнаружить строку сj.val IS NULL
начала. Если вы включите его вместе сON j.val IS DISTINCT FROM foo.val
вами, то вам нужно будет проверить другой столбец сj
описанием,NOT NULL
чтобы разделить два случая. Но дополнительный столбец не определен.