카테고리:

반정형 및 정형 데이터 함수 (추출)

GET_PATH , :

경로 이름을 사용하여 반정형 데이터에서 값을 추출합니다.

GET_PATH는 GET 의 변형입니다. 첫 번째 인자로서 VARIANT, OBJECT 또는 ARRAY 열 이름을 사용하고, 두 번째 인자로서 제공된 경로 이름에 따라 필드 또는 요소의 값을 추출합니다.

구문

GET_PATH( <column_identifier> , '<path_name>' )

<column_identifier>:<path_name>

:( <column_identifier> , '<path_name>' )
Copy

인자

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"
           }
         }');

INSERT INTO get_path_demo (id, v)
  SELECT 2,
         PARSE_JSON('{
           "array1" : [
             {"id1": "value_c1", "id2": "value_c2", "id3": "value_c3"}
           ],
           "array2" : [
             {"id1": "value_d1", "id2": "value_d2", "id3": "value_d3"}
           ],
           "object_outer_key1" : {
             "object_inner_key1a": "object_y1",
             "object_inner_key1b": "object_y2"
           }
         }');

SELECT * FROM get_path_demo;
Copy
+----+----------------------------------------+
| ID | V                                      |
|----+----------------------------------------|
|  1 | {                                      |
|    |   "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"  |
|    |   }                                    |
|    | }                                      |
|  2 | {                                      |
|    |   "array1": [                          |
|    |     {                                  |
|    |       "id1": "value_c1",               |
|    |       "id2": "value_c2",               |
|    |       "id3": "value_c3"                |
|    |     }                                  |
|    |   ],                                   |
|    |   "array2": [                          |
|    |     {                                  |
|    |       "id1": "value_d1",               |
|    |       "id2": "value_d2",               |
|    |       "id3": "value_d3"                |
|    |     }                                  |
|    |   ],                                   |
|    |   "object_outer_key1": {               |
|    |     "object_inner_key1a": "object_y1", |
|    |     "object_inner_key1b": "object_y2"  |
|    |   }                                    |
|    | }                                      |
+----+----------------------------------------+

각 행에서 array2 에서 id3 값을 추출합니다.

SELECT id,
       GET_PATH(
         v,
         'array2[0].id3') AS id3_in_array2
  FROM get_path_demo;
Copy
+----+---------------+
| ID | ID3_IN_ARRAY2 |
|----+---------------|
|  1 | "value_b3"    |
|  2 | "value_d3"    |
+----+---------------+

: 연산자를 사용하여 각 행의 array2 에서 동일한 id3 값을 추출합니다.

SELECT id,
       v:array2[0].id3 AS id3_in_array2
  FROM get_path_demo;
Copy
+----+---------------+
| 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;
Copy
+----+---------------+
| ID | ID3_IN_ARRAY2 |
|----+---------------|
|  1 | "value_b3"    |
|  2 | "value_d3"    |
+----+---------------+

각 행의 중첩된 OBJECT 값에서 object_inner_key1a 값을 추출합니다.

SELECT id,
       GET_PATH(
         v,
         'object_outer_key1:object_inner_key1a') AS object_inner_key1A_values
  FROM get_path_demo;
Copy
+----+---------------------------+
| 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;
Copy
+----+---------------------------+
| ID | OBJECT_INNER_KEY1A_VALUES |
|----+---------------------------|
|  1 | "object_x1"               |
|  2 | "object_y1"               |
+----+---------------------------+

이 예제는 이전 예제와 동일하지만 SQL 스타일의 큰따옴표 식별자를 사용합니다.

SELECT id,
       v:"object_outer_key1":"object_inner_key1a" AS object_inner_key1a_values
  FROM get_path_demo;
Copy
+----+---------------------------+
| ID | OBJECT_INNER_KEY1A_VALUES |
|----+---------------------------|
|  1 | "object_x1"               |
|  2 | "object_y1"               |
+----+---------------------------+