Я попытаюсь объяснить
Буду использовать ниже CTE с моими примерами
WITH `table` AS (
SELECT 1 id, [STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64>>('a', ('1',1)),('b', ('2',2)),('c', ('3',3))] params UNION ALL
SELECT 2, [STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64>>('x', ('666', 666)),('y', ('777',777))]
)
Пример # 1 - простой SELECT *
#standardSQL
SELECT *
FROM `table`
это дает ниже [очевидно ожидаемый] результат
Row id params.key params.value.string_value params.value.int_value
1 1 a 1 1
b 2 2
c 3 3
2 2 x 666 666
y 777 777
Пример # 2 - UNNEST без псевдонима
#standardSQL
SELECT *
FROM `table`, UNNEST(params)
результат будет
Row id params.key params.value.string_value params.value.int_value key value.string_value value.int_value
1 1 a 1 1 a 1 1
b 2 2
c 3 3
2 1 a 1 1 b 2 2
b 2 2
c 3 3
3 1 a 1 1 c 3 3
b 2 2
c 3 3
4 2 x 666 666 x 666 666
y 777 777
5 2 x 666 666 y 777 777
y 777 777
теперь вы можете видеть два дополнительных столбца с именами key
и value
(значение STRUCT с двумя полями соответственно string_value
и int_value), которые следовали после имен соответствующих полей STRUCT, полученных в результате UNNEST'ing ARRAYSTRUCT.
ВАЖНО: столбцы, начинающиеся с params
, на самом деле являются частью REPEATED RECORD и не могут быть доступны напрямую, тогда как на те поля, которые являются результатом UNNEST'ing, можно напрямую ссылаться (если некоторые из них не являются массивами (s) сами по себе, в этом случае понадобится второе UNNEST)
Итак, короткая история - мы можем просто ссылаться на них как key
и value
- например,
Пример № 3 - см.Включение «унаследованных» имен полейесли есть другое поле с именем (например) `ключ ', то вы хотите иметь возможность обратиться к этому
#standardSQL
SELECT id AS key, param.key AS param_key, value
FROM `table`, UNNEST(params) param
с результатом как
Row key param_key value.string_value value.int_value
1 1 a 1 1
2 1 b 2 2
3 1 c 3 3
4 2 x 666 666
5 2 y 777 777
Надеюсь, что выше, поможет вамподружитесь с UNNEST: o)
Вы можете прочитать больше о UNNEST
в документации по ОТ условия - перейдите туда и прокрутите немного вниз до раздела UNNEST
Пример # 5 - случай, когда требуется псевдоним
Если вам нужно UNNEST простой массив, как показано ниже CTE, единственный способ ссылаться на плоский элемент - ТОЛЬКО через псевдоним
WITH `project.dataset.table` AS (
SELECT 1 id, [1,2,3] params UNION ALL
SELECT 2, [666,777]
)
например
#standardSQL
SELECT id, param
FROM `project.dataset.table`, UNNEST(params) param
WHERE NOT param IN (2,777)
с результатом
Row id param
1 1 1
2 1 3
3 2 666