ARRAY(배열)
-프로그래밍 언어에서 지원하는 자료형 중 하나
-같은 타입의 여러 값을 하나의 컬럼에 저장할 수 있는 자료형
Ex> 1, 3, 5, 6을 각각을 숫자형으로 저장하는 것이 아닌 하나로 저장
-Big Query에선 []을 사용하거나 ARRAY로 지정해서 쓸 수 있음
-배열로 저장할 때 저장 용량이 효율적
배열 생성하기
1)대괄호 사용하기
-대괄호[] 사용하기
SELECT [0, 1, 1, 2, 3, 5] AS some_numbers
UNION ALL
SELECT [2, 4, 8, 16, 32]
UNION ALL
SELECT [5, 10]
2)ARRAY<> 사용하기 : ARRAY<자료형>
-"가"는 String이라 실행이 불가능하다
SELECT
ARRAY<INT64>[0,1,"가"] AS some_numbers
Array element type STRING does not coerce to INT64 at [2:20]
3)배열 생성 함수 사용
SELECT
GENERATE_DATE_ARRAY('2024-01-01', '2024-02-01', INTERVAL 1 WEEK) AS output1,
GENERATE_ARRAY(1,5,2) AS output2
4)ARRAY_AGG 함수 사용 : 여러 결과를 마지막에 배열로 저장하고 싶은 경우
-ARRAY_AGG 함수 사용 : 여러 결과를 마지막에 배열로 저장하는 경우
WITH programmong_languages AS (
SELECT "ptyhon" AS programmong_languages
UNION ALL
SELECT "go"
UNION ALL
SELECT "scala"
)
SELECT *
FROM programmong_languages
-ARRAY_AGG 함수 : 여러 결과를 마지막에 배열로 저장하고 싶은 경우
SELECT ARRAY_AGG(programmong_languages) AS out_put
FROM programmong_languages
배열에 접근하기 위해서는 OFFSET, ORDINAL을 사용한다.
-OFFSET : 0부터 시작
-ORDINAL : 1부터 시작
Ex> SELECT 배열_컬럼[OFFSET/ORDINAL숫자)]
-단, 배열의 길이보다 큰 값을 지정하면 오류가 발생한다
: Array index N is out of bounds (overflow) 방지하기 위해 SAFE_를 항상 추가
WITH array_samples AS (
SELECT [0, 1, 1, 2, 3, 5] AS some_numbers
UNION ALL
SELECT [2, 4, 8, 16, 32]
UNION ALL
SELECT [5, 19]
)
SELECT
some_numbers[SAFE_OFFSET(1)] AS first_value
FROM array_samples
WITH array_samples AS (
SELECT [0, 1, 1, 2, 3, 5] AS some_numbers
UNION ALL
SELECT [2, 4, 8, 16, 32]
UNION ALL
SELECT [5, 19]
)
SELECT
some_numbers[SAFE_OFFSET(5)] AS first_value
FROM array_samples
STRUCT(구조체)
-프로그래밍 언어에서 지원하는 자료형 중 하나
-서로 다른 타입의 여러 값을 하나의 컬럼에 저장할 수 있는 자료형
Ex> 사람이라는 STRUCT에 이름(문자열), 나이(정수), 성별(문자) 등을 하나로 묶어 저장
1) 소괄호() 사용하기
SELECT
(1, 2, 3) AS struct_test
2) STRUCT<>() 사용하기 : STRUCT<자료형>(데이터)
SELECT
STRUCT<hi INT64, hello INT64, awesome STRING>(1,2,'HI') AS struct_test
SELECT
struct_test.hi,
struct_test.hello
FROM(
SELECT
STRUCT<hi INT64, hello INT64,
awesome STRING>(1,2,'HI') AS struct_test
)
UNNEST
UNNEST는 CROSS JOIN과 , 를 사용해서 작성을 할 수 있다.
-배열을 직접적으로 접근해서 사용하는 것보다, 독립적인 행으로 풀어서(평면화) 사용
= ARRAY의 요소를 독립적인 행으로 펼칠 때 UNNEST를 사용한다
WITH example_data AS(
SELECT
'kyle' AS name,
['Python', 'SQL', 'R', 'Julia', 'Go'] AS preferred_language,
'Incheon' AS hometown
UNION ALL
SELECT
'max' AS name,
['Python', 'SQL', 'Scala', 'Java', 'Kotlin'] AS preferred_language,
'Seoul' AS hometown
UNION ALL
SELECT
'yun' AS name,
['Python', 'SQL'] AS preferred_language,
'Incheon' AS hometown
)
SELECT
name,
pre_lang,
hometown
FROM example_data
CROSS JOIN UNNEST(preferred_language) AS pre_lang