Как проверить, что каждое значение оператора IN присутствует в результате запроса SQL?

У меня есть набор tableA

Имя Город Пауло Рим Руди Сингапур Мин Сингапур Такеши Токио Джуди Джакарта Юки Токио Стив Сингапур

Я хочу убедиться, что этот человек из Берлина, Сингапура и Токио, все три города присутствуют в таблице.

У меня есть этот SQL-запрос, чтобы проверить наличие каждого города.

select a.*
from (
select *,
  row_number() over (partition by city ) as rn
from tableA
where city in (Berlin, Tokyo, Singapore)
) a
where rn = 1

С помощью этого запроса я могу узнать, что присутствует как минимум 1 человек из этих стран, а из Берлина на самом деле нет ни одного. Я хочу, чтобы запрос мог подтвердить наличие всех городов, находящихся в состоянии IN. Он вернется True если все они присутствуют и False если один из них отсутствует. Возможно ли это сделать? Предложение по более простому запросу также приветствуется.

Вы можете присоединиться к городам.

jarlh 29.08.2024 13:07
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете определить города, которые отсутствуют в данных, используя левое соединение с CTE, содержащим данные для городов:

WITH cities(name) as (values 'Berlin', 'Tokyo', 'Singapore') -- define the cities 

select cities.name
from cities
left join tableA on cities.name = tableA.City
where tableA.Name is null;

Выход

  name
--------
 Berlin
Ответ принят как подходящий

Вы можете сравнить количество городов в IN(...) и количество строк вывода запроса.

select case when count(*)=3 then 'true' else 'false' end res
from (
  select *,
    row_number() over (partition by city order by name) as rn
  from tableA
  where city in ('Berlin', 'Tokyo', 'Singapore')
) a
where rn = 1

рез = 'ложь'

ИЛИ проще

select case when count(*)=3 then 'true' else 'false' end res
from(
  select distinct city
  from tableA
  where city in ('Berlin', 'Tokyo', 'Singapore')
) a

Пример

По предложению @jarlh

select case when count(distinct city)=3 then 'true' else 'false' end res
from tableA
where city in ('Berlin', 'Tokyo', 'Singapore')

Я не могу проверить это на amazon-athena, но это прекрасное решение!

Вы даже можете сделать count(distinct city)=3 и пропустить подзапрос.

jarlh 29.08.2024 14:20

@jarlh, ты можешь предложить это как отдельный ответ. Мне кажется, это самое элегантное решение.

ValNik 29.08.2024 14:25

Незачем. Это ваш запрос немного улучшился.

jarlh 29.08.2024 14:27

«но это красивое решение» — у него есть небольшая проблема — редактирование количества городов требует редактирования условия подсчета.

Guru Stron 29.08.2024 15:11

Возможно, список городов динамически генерируется интерфейсом, и checkCount является одним из параметров. Кроме того, я думаю, что это простой случай, когда запрос возвращает количество городов, а лицевая сторона сравнивает это значение с количеством городов в списке параметров. query_result=CityList.Count

ValNik 29.08.2024 15:16

Если список городов является результатом другого запроса, нужно смотреть контекст — запрос может быть совершенно другим.

ValNik 29.08.2024 15:23

Огромное спасибо ребята за ответы. у меня все работает.

YazerieL 30.08.2024 03:49
  • RIGHT JOIN 3 города.

  • Посчитайте ненайденные.

  • Если 0, верните True, иначе верните False.

select case when count(*) = 0 then 'True' else 'False' end 
from tableA
right join (values ('Berlin'), ('Tokyo'), ('Singapore')) c (city)
    on tableA.city = c.city
where tableA.city is null

Демо: https://dbfiddle.uk/BDA3ZlmC

Другие вопросы по теме