데이터 처리/SQL

[빅쿼리(BigQuery)] JSON 데이터 타입 다루기 (4) TO_JSON_STRING 함수

yourhm 2025. 12. 30. 19:02

TO_JSON_STRING

값을 "JSON-formatted 문자열"로 직렬화하는 함수.

 

- 리턴 값의 데이터 타입은 json이 아니라 string(문자열)이다. 

- 단, 문자열이 JSON format으로 보이는 것일 뿐.

- 인자로 “어떤 타입의 값을 넣느냐”에 따라 결과의 JSON format 달라진다.

 

 

 

예시 1. FROM에 입력한 테이블을 참조하는 경우 => 행 단위 직렬화

예시 테이블

 

id name age
1 Alice 30
2 Jenny 31

 

SELECT TO_JSON_STRING(t) AS json_row
FROM sample_table AS t;

 

- row 단위로 JSON 직렬화가 적용됨.

- JSON 객체 포맷으로 출력됨.

-> 컬럼명이 JSON key
-> 값이 JSON value

 

FROM sample_table AS t

=> 이건 단순히 “이 테이블을 이후 쿼리에서 t라는 이름으로 부르겠다" 라는 의미다. 하지만 SELECT에서 테이블의 별칭 t 를 직접 참고하게 되면, 빅쿼리는 이렇게 해석한다.

 

-- t = 현재 row의 모든 컬럼을 묶은 값
-- 내부 타입: STRUCT<id, name, age, ...>
-- FROM 절에 정의된 테이블 alias는 해당 테이블의 row 타입(= STRUCT 타입) 이름이 된다

t STRUCT<
  id INT64,
  name STRING,
  age INT64
>

 

즉 t는 “테이블 전체”가 아니라 “현재 row 전체를 대표하는 STRUCT”로 인식되어 직렬화되는 것.

 

 

 

 

예시 2. 컬럼 하나를 넣는 경우

이 경우 결과는 컬럼의 데이터 타입에 따라 달라진다.

 

id name age profile(STRUCT) tags(ARRAY<STRING>) payload(JSON)
1 Alice 30 (Seoul, 12345) ["bigquery","sql"] {"vip":true,"score":10,"meta":{"tier":"gold"}}
2 Jenny 31 (Busan, 54321) ["analytics","etl"] {"vip":false,"score":7,"meta":{"tier":"silver"}}

 

 

(1) 기본 타입 컬럼 (STRING, INT, BOOL 등)

SELECT TO_JSON_STRING(name) AS json_name
FROM sample_table;

- string의 경우 따옴표 포함

- 숫자는 숫자만 그대로

 

 

 

(2) STRUCT 타입 컬럼

SELECT TO_JSON_STRING(profile) AS json_profile
FROM sample_table;

 

json_profile
1 {"city":"Seoul","zip":"12345"}
2 {"city":"Busan","zip":"54321"}

 

- STRUCT 컬럼은 내부 필드명이 key가 되어 JSON 객체로 나온다.

 

 

 

(3) ARRAY 타입 컬럼

SELECT TO_JSON_STRING(tags) AS json_tags
FROM sample_table;

 

json_profile
1 ["bigquery","sql"]
2 ["analytics","etl"]

 

- ARRAY 컬럼은 → JSON 배열로 나온다.

 

 

 

(4) JSON Object 컬럼

SELECT TO_JSON_STRING(payload) AS json_payload
FROM sample_table;

 

json_payload
1 {"vip":true,"score":10,"meta":{"tier":"gold"}}
2 {"vip":false,"score":7,"meta":{"tier":"silver"}}

 

- 이미 JSON 타입이면 그 JSON 값 자체가 그대로 그 JSON형태를 유지하며 문자열로 변환됨.