GET_PATH, :

GET_PATH, : (경로를 통한 반정형 데이터 추출)

경로 이름을 사용해 반정형 데이터에서 값을 추출해요.

GET_PATH는 GET의 변형이에요. 첫 번째 인자로 VARIANT, OBJECT 또는 ARRAY 컬럼 이름을 받고, 두 번째 인자로 제공된 경로 이름에 따라 필드나 요소의 값을 추출해요.

출처: Snowflake SQL Reference - GET_PATH, :

본문

구문

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"               |
+----+---------------------------+

더 알아보기