GET_PATH, :
GET_PATH, : (경로를 통한 반정형 데이터 추출)
경로 이름을 사용해 반정형 데이터에서 값을 추출해요.
GET_PATH는 GET의 변형이에요. 첫 번째 인자로 VARIANT, OBJECT 또는 ARRAY 컬럼 이름을 받고, 두 번째 인자로 제공된 경로 이름에 따라 필드나 요소의 값을 추출해요.
본문
구문
GET_PATH( <column_identifier> , '<path_name>' )
<column_identifier>:<path_name>
:( <column_identifier> , '<path_name>' )
인자
column_identifier
VARIANT, OBJECT 또는 ARRAY 컬럼으로 평가되는 표현식이에요.
path_name
VARCHAR 값으로 평가되는 표현식이에요. 이 값은 추출하려는 필드나 요소의 경로를 지정해요. 구조화 타입의 경우 문자열 상수를 지정해야 해요.
반환 값
- 반환 값은 ARRAY의 지정한 요소, 또는 OBJECT의 키-값 쌍에서 지정한 키에 해당하는 값이에요.
- 입력 객체가 반정형 OBJECT, ARRAY 또는 VARIANT 값이면 함수는 VARIANT 값을 반환해요. 값의 데이터 타입이 VARIANT인 이유는: ARRAY 값에서 각 요소는 VARIANT 타입이고, OBJECT 값에서 각 키-값 쌍의 값은 VARIANT 타입이기 때문이에요.
- 입력 객체가 구조화 OBJECT, 구조화 ARRAY 또는 MAP이면 함수는 객체에 지정된 타입의 값을 반환해요. 예를 들어 입력 객체의 타입이 ARRAY(NUMBER)이면 함수는 NUMBER 값을 반환해요.
사용 참고 사항
- GET_PATH는 GET 함수의 연쇄와 동일해요. 경로 이름이 어떤 요소에도 대응하지 않으면 NULL을 반환해요.
- 경로 이름 구문은 표준 JavaScript 표기법이에요. 마침표(.)가 앞에 붙은 필드 이름(식별자)과 인덱스 연산자(예:
[<index>])의 연결로 구성돼요:- 첫 번째 필드 이름은 앞의 마침표를 지정할 필요가 없어요.
- 인덱스 연산자의 인덱스 값은 (배열의 경우) 음이 아닌 10진수이거나 (객체 필드의 경우) 작은따옴표 또는 큰따옴표 문자열 리터럴일 수 있어요. 자세한 내용은 반정형 데이터 쿼리를 참고해요.
- GET_PATH는 또한
:(콜론) 문자를 추출 연산자로 사용하는 구문 단축키를 지원해요. 이 연산자는 (마침표를 포함할 수 있는) 컬럼 이름을 경로 지정자와 구분해요. 구문 일관성을 유지하기 위해 경로 표기법은 SQL 스타일 큰따옴표 식별자와:를 경로 구분 기호로 사용하는 것도 지원해요.:연산자를 사용하면[]안에 정수 또는 문자열 하위 표현식을 포함할 수 있어요.
예시
VARIANT 컬럼이 있는 테이블을 만들고 PARSE_JSON 함수를 사용해 VARIANT 데이터를 삽입해요. VARIANT 값에는 중첩 ARRAY 값과 OBJECT 값이 포함돼요.
CREATE OR REPLACE TABLE get_path_demo(
id INTEGER,
v VARIANT);
INSERT INTO get_path_demo (id, v)
SELECT 1,
PARSE_JSON('{
"array1" : [
{"id1": "value_a1", "id2": "value_a2", "id3": "value_a3"}
],
"array2" : [
{"id1": "value_b1", "id2": "value_b2", "id3": "value_b3"}
],
"object_outer_key1" : {
"object_inner_key1a": "object_x1",
"object_inner_key1b": "object_x2"
}
}');
각 행의 array2에서 id3 값을 추출해요:
SELECT id,
GET_PATH(
v,
'array2[0].id3') AS id3_in_array2
FROM get_path_demo;
+----+---------------+
| ID | ID3_IN_ARRAY2 |
|----+---------------|
| 1 | "value_b3" |
| 2 | "value_d3" |
+----+---------------+
같은 id3 값을 각 행의 array2에서 추출하려면 : 연산자를 사용해요:
SELECT id,
v:array2[0].id3 AS id3_in_array2
FROM get_path_demo;
+----+---------------+
| ID | ID3_IN_ARRAY2 |
|----+---------------|
| 1 | "value_b3" |
| 2 | "value_d3" |
+----+---------------+
이 예시는 SQL 스타일 큰따옴표 식별자를 사용한다는 점을 제외하면 이전 예시와 같아요:
SELECT id,
v:"array2"[0]."id3" AS id3_in_array2
FROM get_path_demo;
각 행의 중첩 OBJECT 값에서 object_inner_key1a 값을 추출해요:
SELECT id,
GET_PATH(
v,
'object_outer_key1:object_inner_key1a') AS object_inner_key1A_values
FROM get_path_demo;
+----+---------------------------+
| ID | OBJECT_INNER_KEY1A_VALUES |
|----+---------------------------|
| 1 | "object_x1" |
| 2 | "object_y1" |
+----+---------------------------+
같은 object_inner_key1a 값을 추출하려면 : 연산자를 사용해요:
SELECT id,
v:object_outer_key1.object_inner_key1a AS object_inner_key1a_values
FROM get_path_demo;
+----+---------------------------+
| ID | OBJECT_INNER_KEY1A_VALUES |
|----+---------------------------|
| 1 | "object_x1" |
| 2 | "object_y1" |
+----+---------------------------+