Нет соответствующей подписи для оператора IN для типов аргументов ARRAY <STRING> - PullRequest
2 голосов
/ 02 июля 2019

Я бы хотел выполнить следующий стандартный SQL, используя "WHERE xxx IN ('aaa', 'bbb')".

Но произошла ошибка. Можно ли использовать IN в стандартном SQL?

Стандартный SQL

SELECT commit, author.name, committer.name, committer.time_sec,
committer.tz_offset, committer.date.seconds , subject, message,
repo_name
FROM `bigquery-public-data.github_repos.commits`
WHERE repo_name IN 
('tensorflow/tensorflow', 'facebook/react')

Error

No matching signature for operator IN for argument types ARRAY<STRING> and {STRING} at [5:17]

Кажется, что следующий устаревший SQL работает нормально.

Устаревший SQL

SELECT commit, author.name, committer.name, committer.time_sec,
committer.tz_offset, committer.date.seconds , subject, message,
repo_name
FROM [bigquery-public-data:github_repos.commits] 
WHERE repo_name IN 
('tensorflow/tensorflow', 'facebook/react')

Ответы [ 3 ]

3 голосов
/ 02 июля 2019

Вы не можете сделать это в Standard SQL. Но в этой статье Как использовать функцию UNNEST в BigQuery для анализа параметров событий в Analytics они объясняют это очень хорошо.

Вот как вы получаете результат, который вы ищете, я думаю:

SELECT commit, author.name as author_name, committer.name as committer_name, committer.time_sec,
committer.tz_offset, committer.date.seconds , subject, message,
repo_name
FROM `bigquery-public-data.github_repos.commits`
CROSS JOIN UNNEST(repo_name) as repo_names_unnested
WHERE repo_names_unnested IN ('tensorflow/tensorflow', 'facebook/react')

Обратите внимание, что вы не можете иметь оба значения author.name и committer.name, так как оба будут отображаться как name. Поэтому я изменил их на author_name и committer_name.

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

2 голосов
/ 02 июля 2019

Ниже для стандартного SQL BigQuery

В случае, если вам нужно сохранить исходные записи и просто вывести их с «tenorflow / tenorflow", «facebook / реагировать» в repo_name:

#standardSQL
SELECT commit, author.name AS author_name, committer.name AS committer_name, committer.time_sec,
committer.tz_offset, committer.date.seconds , subject, message,
repo_name
FROM `bigquery-public-data.github_repos.commits`
WHERE EXISTS (
  SELECT 1 FROM UNNEST(repo_name) name WHERE name IN ('tensorflow/tensorflow', 'facebook/react') 
)
0 голосов
/ 02 июля 2019

Поле 'repo_name' имеет значение REPEATED (устаревший SQL) или ARRAY (стандартный SQL), которое оператор IN не поддерживает для стандартного SQL. Чтобы преобразовать массив во множество строк, вы можете использовать UNNEST оператор .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...