Google Bigquery, предложение WHERE на основе элемента JSON

#google-bigquery

# #google-bigquery

Вопрос:

У меня есть импорт bigquery из базы данных firestore, где я хочу запросить определенное поле из документа. Это было заполнено с помощью расширения firestore-bigquery, и данные документа хранятся в виде строки JSON.

Я пытаюсь использовать предложение WHERE в своем запросе, в котором используется одно из полей из данных JSON. Однако, похоже, это не работает.

Мой запрос выглядит следующим образом:

 SELECT json_extract(data,'$.title') as title,p
FROM `table`  
left join unnest(json_extract_array(data, '$.tags')) as p
where json_extract(data,'$.title') = 'technology'
 

data является объектом JSON и title является атрибутом всех элементов. Приведенный выше запрос будет выполнен, но не даст «никаких результатов» (там определенно есть результаты для рассматриваемого заголовка, поскольку они отображаются в предварительном просмотре таблицы).

Я также пытался использовать WHERE title = 'technology' , но это возвращает ошибку, которая title является нераспознанным полем (отсюда и json_extract ).

Из моих исследований это должно работать как стандартный запрос SQL JSON, но, похоже, не работает в Bigquery. Кто-нибудь знает способ обойти это?

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

Редактировать Мне интересно, поможет ли в этом настройка представления? Хотя, в конечном счете, я хотел бы запросить это на основе разных параметров и документов здесь https://cloud.google.com/bigquery/docs/views предположим, вы не можете ссылаться на параметры запроса в представлении

Ответ №1:

С тех пор мне удалось разобраться с этим, и я поделюсь решением для всех, у кого такая же проблема.

Решение состояло в том, чтобы использовать JSON_VALUE в предложении WHERE вместо этого, например:

 where JSON_VALUE(data,'$.title') = 'technology';
 

Я все еще не уверен, что это лучший способ сделать это с точки зрения производительности и стоимости, поэтому я подожду, чтобы узнать, оставит ли кто-нибудь еще лучший ответ.