Какова семантика SQL 'ОТ UNNEST'? - PullRequest
0 голосов
/ 23 октября 2018

При чтении выражения на формальном языке я привык читать изнутри, то есть понимать подвыражения и строить в целом.В этот фрагмент SQL :

SELECT 
  (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'TITLE') AS level_id,
  (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'url') AS url
FROM `events_20180725`
WHERE event_name = 'SCI_ERROR'

Одно подвыражение:

SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'TITLE'

Это не обычный подзапрос: если бы я попытался запустить его самостоятельно,Я получил бы ошибку, потому что event_params не массив.Таким образом, кажется, что

  • UNNEST может использоваться с чем-то, кроме массивов.
  • Существует некоторая привязка таблицы events_20180725, используемой во внешнем FROMчто делает его доступным для UNNEST внутри подзапроса.

https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays содержит некоторые примеры (в разделе «Запросы к вложенным массивам»), но фактически не объясняет семантику.Что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Оператор UNNEST берет ARRAY и возвращает таблицу с одной строкой для каждого элемента в ARRAY.Вы также можете использовать UNNEST вне предложения FROM с оператором IN.

Для входных массивов большинства типов элементов вывод UNNEST обычно имеет один столбец.Этот единственный столбец имеет необязательный псевдоним, который можно использовать для ссылки на столбец в другом месте запроса.ARRAYS с этими типами элементов возвращают несколько столбцов:

STRUCT UNNEST разрушает порядок элементов во входной ARRAY.Используйте необязательное предложение WITH OFFSET для возврата второго столбца с индексами элементов массива (см. Ниже).

Для входного массива STRUCTs UNNEST возвращает строку для каждого STRUCT, с отдельным столбцом для каждого поля вСТРУКТУРА.Псевдонимом для каждого столбца является имя соответствующего поля STRUCT.

Вы можете прочитать намного больше о UNNEST в гораздо более подходящем разделе - Предложение FROM - перейдите тудаи прокрутите немного вниз до секции UNNEST

0 голосов
/ 23 октября 2018

Внешний запрос, который выбирается из events_20180725, вводит event_params в область списка выбора.Когда вы помещаете скалярный подзапрос в список выбора, этот подзапрос может ссылаться на столбцы из внешней области видимости.Функция UNNEST возвращает отношение с учетом ссылки на столбец, которая вводит в область действия подзапроса другие столбцы, а именно key и value в этом случае.В случае этого скалярного подзапроса:

(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'TITLE')

Фильтрация по key = 'TITLE' ограничивает строки, возвращаемые UNNEST, только той, где ключ имеет это значение.

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