Bigquery: STRUCT (*) синтаксис - PullRequest
       47

Bigquery: STRUCT (*) синтаксис

0 голосов
/ 17 февраля 2020

Как я могу автоматически применить STRUCT ко всем полям в таблице, не указывая их по имени?

Пример, который не работает:

WITH data as (
 SELECT 'Alex' as name, 14 as age, 'something else 1' other_field
UNION ALL 
 SELECT 'Bert' as name, 14 as age, 'something else 2' other_field
UNION ALL 
 SELECT 'Chiara' as name, 13 as age, 'something else 3' other_field
)

SELECT AS STRUCT(SELECT * except (other_field) from data) as student_data

Возвращает: Error: Scalar subquery cannot have more than one column unless using SELECT AS STRUCT to build STRUCT values at [9:17]

Это, однако, работает:

WITH data as (
 SELECT 'Alex' as name, 14 as age, 'something else 1' other_field
UNION ALL 
 SELECT 'Bert' as name, 14 as age, 'something else 2' other_field
UNION ALL 
 SELECT 'Chiara' as name, 13 as age, 'something else 3' other_field
)

SELECT STRUCT(name,age) as student_data

from data

Проблема в том, что, если у меня есть 100 столбцов, которым не принадлежат только 5, это сводит меня с ума, выписывая их. Есть ли более простой способ использовать какую-то версию Select * Except()?

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Вам нужно выражение для AS STRUCT expr

SELECT AS STRUCT data.* except (other_field) from data
1 голос
/ 17 февраля 2020

Ниже для BigQuery Standard SQL

#standardSQL
WITH data AS (
  SELECT 'Alex' AS name, 14 AS age, 'something else 1' other_field UNION ALL 
  SELECT 'Bert' AS name, 14 AS age, 'something else 2' other_field UNION ALL 
  SELECT 'Chiara' AS name, 13 AS age, 'something else 3' other_field
)
SELECT (
  SELECT AS STRUCT * EXCEPT(other_field)
  FROM UNNEST([t])
  ) AS student_data
FROM data t   

с выводом

Row student_data.name   student_data.age     
1   Alex                14   
2   Bert                14   
3   Chiara              13   
...