Фильтрация по полю массива в BigQuery

У меня есть следующий запрос для получения данных для фильма:

with Movies as (
  select 'Titanic' as title,
  1997 as year, 
  ['Drama',' Romance'] as Genres
)
select * from Movies where title='Titanic'

И для фильтрации по тем записям, в которых жанры включают: «Драма»:

with Movies as (
  select 'Titanic' as title,
  1997 as year, 
  ['Drama',' Romance'] as Genres
)
select * from Movies where "Drama" in UNNEST(Genres)

Однако как мне отфильтровать те записи, которые относятся к жанру «Драма», но включают только те жанры, которые я указал (Драма). Другими словами, я хочу, чтобы набор результатов выглядел так:

title      year         Genres
Titanic    1997         Drama

И не включать в запись все жанры — мне нужны только те, которые соответствуют жанрам — как мне это сделать?


Обновление: после некоторого возни, вот что сработало для меня - это кажется невероятно хакерским и не совсем понятно, почему это работает (ответ, объясняющий, как лучше это сделать, был бы замечательным), но вот оно:

with Movies as (
  select 'Titanic' as title,
  1997 as year, 
  ['Drama',' Romance'] as Genres
)
select * from (
  select title, year, g from (select title, year, Genres as g from Movies t0, t0.Genres) group by title, year, g
) where g = 'Drama'

Обновление 2: упрощено до:

with Movies as (
  select 'Titanic' as title,
  1997 as year, 
  ['Drama',' Romance'] as Genres
)
select title, year, Genres from Movies t0, t0.Genres where Genres='Drama'
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
1 472
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Попробуйте присоединиться к UNNEST:

with Movies as (
  select 'Titanic' as title, 1997 as year, ['Drama',' Romance'] as Genres
)
select title, year, Genre 
from Movies, UNNEST(Genres) as Genre
where Genre = "Drama"

Спасибо. В чем разница между делать FROM Movies, Genres as Genre и делать FROM Movies, UNNEST(Genres) as Genre ?

David542 11.12.2020 06:21
FROM Movies, Genres as Genre просто не будет работать, а FROM Movies, UNNEST(Genres) as Genre работает :on)
Mikhail Berlyant 11.12.2020 06:22

@MikhailBerlyant извините, это опечатка - я имел в виду FROM Movies, Movies.Genres против FROM Movies, UNNEST(Genres)

David542 11.12.2020 06:28
FROM Movies, Genres as Genre попытается найти другую таблицу с именем Genres и будет тормозить, если у вас ее нет. Вместо этого вы можете использовать from Movies, Movies.Genres as Genre.
Sergey Geron 11.12.2020 06:29

@SergeyGeron Понятно, так как же тогда BQ разрешает столбец UNNEST(Genres) - какие таблицы он знает для поиска?

David542 11.12.2020 06:31

Таков синтаксис. UNNEST дает BigQuery подсказку для поиска этого поля внутри другой таблицы из блока WHERE.

Sergey Geron 11.12.2020 06:33

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

select * except(Genres)
from Movies, unnest(Genres) as Genre
where Genre = "Drama"  

с выходом

В случае, если вам (по какой-то причине) нужно сохранить имя столбца как жанры и жанры - ниже должно работать

select * except(Genres, Genre), Genre as Genres
from Movies, unnest(Genres) as Genre
where Genre = "Drama"

с выходом

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