정형 데이터 타입

정형 유형은 특정 Snowflake 데이터 타입 을 갖는 요소 또는 키-값 페어를 포함하는 ARRAY, OBJECT 또는 MAP입니다. 다음은 정형 유형의 예입니다.

  • INTEGER개 요소로 구성된 ARRAY.

  • VARCHAR 및 NUMBER 키-값 페어가 있는 OBJECT.

  • VARCHAR 키를 DOUBLE 값과 연결하는 MAP.

다음과 같은 방법으로 정형 유형을 사용할 수 있습니다.

  • Iceberg 테이블 에서 정형 유형 열을 정의할 수 있습니다.

    Iceberg 데이터 타입 list, struct, map 은 Snowflake의 정형 ARRAY, 정형 OBJECT, MAP 유형에 해당합니다.

  • Iceberg 테이블의 정형 유형 열에서 데이터에 액세스할 때 정형 유형을 사용합니다.

  • 반정형 ARRAY, OBJECT 또는 VARIANT 를 대응하는 정형 유형으로 캐스팅할 수 있습니다(예: ARRAY를 INTEGER 요소로 구성된 ARRAY로 캐스팅). 반정형 유형의 정형 유형을 캐스팅할 수도 있습니다.

참고

현재, Iceberg 테이블 이외의 테이블은 정형 유형을 지원하지 않습니다. 일반 테이블에는 정형 유형의 열을 추가할 수 없습니다.

이 항목에서는 Snowflake에서 정형 유형을 사용하는 방법을 설명합니다.

정형 유형 지정하기

정형 유형 열을 정의하거나 값을 정형 유형으로 캐스팅할 때 다음 섹션에 설명된 구문을 사용하십시오.

정형 ARRAY 지정하기

정형 ARRAY를 지정하려면 다음 구문을 사용하십시오.

ARRAY( <element_type> [ NOT NULL ] )
Copy

여기서

  • element_type 은 이 ARRAY에 있는 요소의 Snowflake 데이터 타입 입니다.

    정형 ARRAY, 정형 OBJECT 또는 MAP을 요소 유형으로 지정할 수도 있습니다.

    참고

    Iceberg 테이블 열 정의에서는 VARIANT, 반정형 ARRAY 또는 반정형 OBJECT를 ARRAY 요소의 유형으로 지정할 수 없습니다.

  • NOT NULL은 ARRAY에 NULL인 요소를 포함할 수 없음을 지정합니다.

예를 들어 다음 문에서 SYSTEM$TYPEOF 함수가 반환하는 유형을 비교해 보십시오.

  • 첫 번째 열 식은 반정형 ARRAY를 정형 ARRAY(NUMBER 요소로 구성된 ARRAY)로 캐스팅합니다.

  • 두 번째 열 식은 반정형 ARRAY를 지정합니다.

SELECT
  SYSTEM$TYPEOF(
    [1, 2, 3]::ARRAY(NUMBER)
  ) AS structured_array,
  SYSTEM$TYPEOF(
    [1, 2, 3]
  ) AS semi_structured_array;
Copy
+-------------------------------+-----------------------+
| STRUCTURED_ARRAY              | SEMI_STRUCTURED_ARRAY |
|-------------------------------+-----------------------|
| ARRAY(NUMBER(38,0))[LOB]      | ARRAY[LOB]            |
+-------------------------------+-----------------------+

정형 OBJECT 지정하기

정형 OBJECT를 지정하려면 다음 구문을 사용하십시오.

OBJECT(
  [
    <key> <value_type> [ NOT NULL ]
    [ , <key> <value_type> [ NOT NULL ] ]
    [ , ... ]
  ]
)
Copy

여기서

  • key 는 OBJECT에 대한 키를 지정합니다.

    • 오브젝트 정의의 각 key 는 고유해야 합니다.

    • 키의 순서는 오브젝트 정의의 일부입니다. 다른 순서로 된 동일한 키를 가진 두 OBJECT를 비교하는 것은 허용되지 않습니다. (컴파일 시간 오류가 발생합니다.)

    • 키를 지정하지 않지만 괄호는 지정할 경우(즉, OBJECT()를 사용하는 경우) 결과 유형은 키가 없는 정형 OBJECT입니다. 키가 없는 정형 OBJECT는 반정형 OBJECT와는 다릅니다.

  • value_type 은 키에 해당하는 값의 Snowflake 데이터 타입 입니다.

    정형 ARRAY, 정형 OBJECT 또는 MAP을 값 유형으로 지정할 수도 있습니다.

    참고

    Iceberg 테이블 열 정의에서는 VARIANT, 반정형 ARRAY 또는 반정형 OBJECT를 OBJECT 키에 해당하는 값의 유형으로 지정할 수 없습니다.

  • NOT NULL은 키에 해당하는 값이 NULL일 수 없음을 지정합니다.

예를 들어 다음 문에서 SYSTEM$TYPEOF 함수가 반환하는 유형을 비교해 보십시오.

  • 첫 번째 열 식은 반정형 OBJECT를 다음 키와 값을 포함하는 정형 OBJECT로 캐스팅합니다.

    • NULL이 아닌 VARCHAR 값을 가진 str 이라는 키.

    • NUMBER 값을 가진 num 이라는 키.

  • 두 번째 열 식은 반정형 OBJECT를 지정합니다.

SELECT
  SYSTEM$TYPEOF(
    {
      'str': 'test',
      'num': 1
    }::OBJECT(
      str VARCHAR NOT NULL,
      num NUMBER
    )
  ) AS structured_object,
  SYSTEM$TYPEOF(
    {
      'str': 'test',
      'num': 1
    }
  ) AS semi_structured_object;
Copy
+----------------------------------------------------------------+------------------------+
| STRUCTURED_OBJECT                                              | SEMI_STRUCTURED_OBJECT |
|----------------------------------------------------------------+------------------------|
| OBJECT(str VARCHAR(16777216), num NUMBER(38,0) NOT NULL )[LOB] | OBJECT[LOB]            |
+----------------------------------------------------------------+------------------------+

MAP 지정하기

MAP을 지정하려면 다음 구문을 사용하십시오.

MAP( <key_type> , <value_type> [ NOT NULL ] )
Copy

여기서

  • key_type 은 맵 키의 Snowflake 데이터 타입 입니다. 키에는 다음 유형 중 하나를 사용해야 합니다.

    • VARCHAR

    • 소수 자릿수가 0인 NUMBER

    부동 소수점 데이터 타입을 키 유형으로 사용할 수 없습니다.

    맵 키는 NULL일 수 없습니다.

  • value_type 은 맵에 있는 값의 Snowflake 데이터 타입 입니다.

    정형 ARRAY, 정형 OBJECT 또는 MAP을 값 유형으로 지정할 수도 있습니다.

    참고

    Iceberg 테이블 열 정의에서는 VARIANT, 반정형 ARRAY 또는 반정형 OBJECT를 MAP의 값 유형으로 지정할 수 없습니다.

  • NOT NULL은 키에 해당하는 값이 NULL일 수 없음을 지정합니다. NOT NULL은 값이 NULL일 수 없음을 지정합니다.

다음 예에서는 반정형 OBJECT를 MAP으로 캐스팅하고 SYSTEM$TYPEOF 함수를 사용하여 오브젝트의 결과 유형을 인쇄합니다. MAP은 VARCHAR 키를 VARCHAR 값과 연결합니다.

SELECT
  SYSTEM$TYPEOF(
    {
      'a_key': 'a_val',
      'b_key': 'b_val'
    }::MAP(VARCHAR, VARCHAR)
  ) AS map_example;
Copy
+------------------------------------------------+
| MAP_EXAMPLE                                    |
|------------------------------------------------|
| map(VARCHAR(16777216), VARCHAR(16777216))[LOB] |
+------------------------------------------------+

반정형 유형에서 정형 유형 사용하기

VARIANT, 반정형 OBJECT 또는 반정형 ARRAY에서는 MAP, 정형 OBJECT 또는 정형 ARRAY를 사용할 수 없습니다. 다음 상황에서는 오류가 발생합니다.

정형 유형과 반정형 유형 변환하기

다음 표에는 정형 OBJECT, 정형 ARRAY, MAP을 반정형 OBJECT, ARRAY, VARIANT(그 반대도 마찬가지임)로 변환 하는 규칙이 요약되어 있습니다.

소스 데이터 타입

대상 데이터 타입

캐스팅 가능

강제 변환 가능

반정형 ARRAY

정형 ARRAY

반정형 OBJECT

  • 정형 OBJECT

  • MAP

반정형 VARIANT

  • 정형 ARRAY

  • 정형 OBJECT

  • MAP

정형 ARRAY

반정형 ARRAY

  • 정형 OBJECT

  • MAP

반정형 OBJECT

  • 정형 ARRAY

  • 정형 OBJECT

  • MAP

반정형 VARIANT

다음 섹션에서는 이러한 규칙을 더 자세히 설명합니다.

반정형 유형을 정형 유형으로 명시적으로 캐스팅하기

반정형 오브젝트를 정형 유형으로 명시적으로 캐스팅하려면 CAST 함수를 호출하거나 :: 연산자를 사용 하면 됩니다.

참고

정형 유형에 대해 TRY_CAST가 지원되지 않습니다.

다음과 같은 반정형 오브젝트만 해당 정형 유형으로 캐스팅할 수 있습니다. 그렇지 않으면 런타임 오류가 발생합니다.

반정형 유형

캐스팅할 수 있는 대상 정형 유형

ARRAY

정형 ARRAY

OBJECT

MAP 또는 정형 OBJECT

VARIANT

MAP 또는 정형 ARRAY 또는 OBJECT

다음 섹션에서는 유형이 캐스팅되는 방법에 대한 자세한 내용을 제공합니다.

반정형 ARRAY 및 VARIANT를 정형 ARRAY로 캐스팅하기

다음 단계에서는 반정형 ARRAY 또는 VARIANT를 NUMBER 요소로 구성된 ARRAY에 캐스팅하는 방법을 보여줍니다.

SELECT
  SYSTEM$TYPEOF(
    CAST ([1,2,3] AS ARRAY(NUMBER))
  ) AS array_cast_type,
  SYSTEM$TYPEOF(
    CAST ([1,2,3]::VARIANT AS ARRAY(NUMBER))
  ) AS variant_cast_type;
Copy

또는:

SELECT
  SYSTEM$TYPEOF(
    [1,2,3]::ARRAY(NUMBER)
  ) AS array_cast_type,
  SYSTEM$TYPEOF(
    [1,2,3]::VARIANT::ARRAY(NUMBER)
  ) AS variant_cast_type;
Copy
+--------------------------+--------------------------+
| ARRAY_CAST_TYPE          | VARIANT_CAST_TYPE        |
|--------------------------+--------------------------|
| ARRAY(NUMBER(38,0))[LOB] | ARRAY(NUMBER(38,0))[LOB] |
+--------------------------+--------------------------+

반정형 ARRAY 또는 VARIANT를 정형 ARRAY로 캐스팅할 때 다음 사항에 유의하십시오.

  • ARRAY의 각 요소는 지정된 유형의 ARRAY로 캐스팅됩니다.

    ARRAY 열을 ARRAY(VARCHAR)로 캐스팅하면 각 값이 VARCHAR로 변환됩니다.

    SELECT
      CAST ([1,2,3] AS ARRAY(VARCHAR)) AS varchar_array,
      SYSTEM$TYPEOF(varchar_array) AS array_cast_type;
    
    Copy
    +---------------+-------------------------------+
    | VARCHAR_ARRAY | ARRAY_CAST_TYPE               |
    |---------------+-------------------------------|
    | [             | ARRAY(VARCHAR(16777216))[LOB] |
    |   "1",        |                               |
    |   "2",        |                               |
    |   "3"         |                               |
    | ]             |                               |
    +---------------+-------------------------------+
    
  • 요소를 지정된 유형으로 캐스팅(예: ['a', 'b', 'c'] 를 ARRAY(NUMBER)로 캐스팅)할 수 없는 경우 캐스팅이 실패합니다.

  • ARRAY에 NULL 요소가 포함되어 있고 ARRAY 유형이 NOT NULL을 지정하는 경우(예: [1, NULL, 3] 을 ARRAY(NUMBER NOT NULL로 캐스팅) 캐스팅이 실패합니다.

  • JSON null 값 인 요소는 대상 요소 유형이 JSON null을 지원하지 않는 경우(즉, 대상 유형이 반정형 ARRAY, OBJECT 또는 VARIANT가 아님) NULL로 변환됩니다.

    예를 들어, ARRAY(NUMBER)로 캐스팅하는 경우 NUMBER는 JSON null을 지원하지 않으므로 JSON Null 값은 NULL로 변환됩니다.

    반면에 ARRAY(VARIANT)로 캐스팅하는 경우 VARIANT가 JSON null을 지원하므로 JSON null 값은 NULL로 변환되지 않습니다.

반정형 OBJECT 및 VARIANT를 정형 OBJECT로 캐스팅하기

다음 단계에서는 반정형 OBJECT 또는 VARIANT를 citystate 키-값 페어(VARCHAR 값)를 포함하는 정형 OBJECT로 캐스팅하는 방법을 보여줍니다.

SELECT
  SYSTEM$TYPEOF(
    CAST ({'city':'San Mateo','state':'CA'} AS OBJECT(city VARCHAR, state VARCHAR))
  ) AS object_cast_type,
  SYSTEM$TYPEOF(
    CAST ({'city':'San Mateo','state':'CA'}::VARIANT AS OBJECT(city VARCHAR, state VARCHAR))
  ) AS variant_cast_type;
Copy

또는:

SELECT
  SYSTEM$TYPEOF(
     {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR, state VARCHAR)
  ) AS object_cast_type,
  SYSTEM$TYPEOF(
     {'city':'San Mateo','state':'CA'}::VARIANT::OBJECT(city VARCHAR, state VARCHAR)
  ) AS variant_cast_type;
Copy
+--------------------------------------------------------------+--------------------------------------------------------------+
| OBJECT_CAST_TYPE                                             | VARIANT_CAST_TYPE                                            |
|--------------------------------------------------------------+--------------------------------------------------------------|
| OBJECT(city VARCHAR(16777216), state VARCHAR(16777216))[LOB] | OBJECT(city VARCHAR(16777216), state VARCHAR(16777216))[LOB] |
+--------------------------------------------------------------+--------------------------------------------------------------+

반정형 OBJECT 또는 VARIANT를 정형 OBJECT로 캐스팅할 때 다음 사항에 유의하십시오.

  • OBJECT에는 OBJECT 유형에 지정되지 않은 추가 키가 포함되면 안 됩니다.

    추가 키가 있으면 캐스트가 실패합니다.

  • OBJECT에 OBJECT 유형에 지정된 키가 없으면 캐스트가 실패합니다.

  • OBJECT의 각 키 값은 해당 키에 대해 지정된 유형으로 변환됩니다.

    값을 지정된 유형으로 캐스팅할 수 없으면 캐스트가 실패합니다.

  • 키의 값이 JSON null 값 인 경우 대상 값 유형이 JSON null을 지원하지 않으면(즉, 대상 유형이 반정형 ARRAY, OBJECT 또는 VARIANT가 아님) 값이 NULL로 변환됩니다.

    예를 들어, OBJECT(city VARCHAR)로 캐스팅하는 경우 VARCHAR은 JSON null을 지원하지 않으므로 JSON null 값은 NULL로 변환됩니다.

    반면에 OBJECT(city VARIANT)로 캐스팅하는 경우 VARIANT가 JSON null을 지원하므로 JSON null 값은 NULL로 변환되지 않습니다.

반정형 OBJECT 및 VARIANT를 MAP으로 캐스팅하기

다음 문은 반정형 OBJECT 또는 VARIANT를 VARCHAR 키를 VARCHAR 값과 연결하는 MAP으로 캐스팅하는 방법을 보여줍니다.

SELECT
  SYSTEM$TYPEOF(
    CAST ({'my_key':'my_value'} AS MAP(VARCHAR, VARCHAR))
  ) AS map_cast_type,
  SYSTEM$TYPEOF(
    CAST ({'my_key':'my_value'} AS MAP(VARCHAR, VARCHAR))
  ) AS variant_cast_type;
Copy

또는:

SELECT
  SYSTEM$TYPEOF(
    {'my_key':'my_value'}::MAP(VARCHAR, VARCHAR)
  ) AS map_cast_type,
  SYSTEM$TYPEOF(
    {'my_key':'my_value'}::VARIANT::MAP(VARCHAR, VARCHAR)
  ) AS variant_cast_type;
Copy
+------------------------------------------------+------------------------------------------------+
| MAP_CAST_TYPE                                  | VARIANT_CAST_TYPE                              |
|------------------------------------------------+------------------------------------------------|
| map(VARCHAR(16777216), VARCHAR(16777216))[LOB] | map(VARCHAR(16777216), VARCHAR(16777216))[LOB] |
+------------------------------------------------+------------------------------------------------+

반정형 OBJECT 또는 VARIANT를 MAP으로 캐스팅할 때 다음 사항에 유의하십시오.

  • 키와 값이 지정된 유형과 일치하지 않으면 키와 값이 지정된 유형으로 변환됩니다.

  • 키와 값을 지정된 유형으로 캐스팅할 수 없으면 캐스트가 실패합니다.

  • 키의 값이 JSON null 값 인 경우 대상 값 유형이 JSON null을 지원하지 않으면(즉, 대상 유형이 반정형 ARRAY, OBJECT 또는 VARIANT가 아님) 값이 NULL로 변환됩니다.

    예를 들어, MAP(VARCHAR, VARCHAR)으로 캐스팅하는 경우 VARCHAR은 JSON null을 지원하지 않으므로 JSON null 값은 NULL로 변환됩니다.

    반면에 MAP(VARCHAR, VARIANT)으로 캐스팅하는 경우 VARIANT가 JSON null을 지원하므로 JSON null 값은 NULL로 변환되지 않습니다.

정형 유형을 반정형 유형으로 명시적으로 캐스팅하기

정형 유형을 반정형 유형으로 명시적으로 캐스팅하려면 CAST 함수를 호출하거나, :: 연산자를 사용하거나 변환 함수(예: TO_ARRAY, TO_OBJECT 또는 TO_VARIANT) 중 하나를 호출할 수 있습니다.

참고

TRY_CAST는 정형 유형에서는 지원되지 않습니다.

정형 유형

캐스팅할 수 있는 대상 반정형 유형

정형 ARRAY

ARRAY

MAP 또는 정형 OBJECT

OBJECT

MAP, 정형 ARRAY 또는 정형 OBJECT

VARIANT

예:

  • col_structured_array 가 ARRAY 인 경우(VARCHAR):

    • CAST(col_structured_array AS ARRAY)는 반정형 ARRAY를 반환합니다.

    • CAST(col_structured_array AS VARIANT)는 반정형 ARRAY를 보유하는 VARIANT를 반환합니다.

  • col_structured_object 가 OBJECT(이름 VARCHAR, 상태 VARCHAR)인 경우:

    • CAST(col_structured_object AS OBJECT)는 반정형 OBJECT를 반환합니다.

    • CAST(col_structured_object AS VARIANT)는 반정형 OBJECT를 보유하는 VARIANT를 반환합니다.

  • col_map 이 MAP인 경우(VARCHAR, VARCHAR):

    • CAST(col_map AS OBJECT)는 반정형 OBJECT를 반환합니다.

    • CAST(col_map AS VARIANT)는 반정형 OBJECT를 보유하는 VARIANT를 반환합니다.

다음 사항을 참고하십시오.

  • 반정형 OBJECT로 캐스팅하는 경우 정형 OBJECT의 키 순서는 유지되지 않습니다.

  • 정형 OBJECT 또는 MAP을 반정형 OBJECT 또는 VARIANT로 캐스팅하는 경우 모든 NULL 값은 JSON null 값 으로 변환됩니다.

    정형 ARRAY를 VARIANT로 캐스팅하는 경우 NULL 값은 그대로 유지됩니다.

    SELECT [1,2,NULL,3]::ARRAY(INTEGER)::VARIANT;
    
    Copy
    +---------------------------------------+
    | [1,2,NULL,3]::ARRAY(INTEGER)::VARIANT |
    |---------------------------------------|
    | [                                     |
    |   1,                                  |
    |   2,                                  |
    |   undefined,                          |
    |   3                                   |
    | ]                                     |
    +---------------------------------------+
    
  • 키에 대해 NUMBER 유형을 사용하는 MAP을 캐스팅하는 경우 MAP 키는 반환된 OBJECT에서 문자열로 변환됩니다.

값을 암시적으로 캐스팅하기(강제 변환)

한 정형 유형에서 다른 정형 유형으로 암시적으로 캐스팅(강제 변환) 하는 데는 다음 규칙이 적용됩니다.

  • 두 가지 기본 오브젝트 유형이 동일한 경우 정형 유형은 다른 정형 유형으로 강제 변환될 수 있습니다.

    • 첫 번째 요소 유형이 두 번째 요소 유형으로 강제 변환 가능한 경우 한 유형의 ARRAY는 다른 유형의 ARRAY로 강제 변환될 수 있습니다.

      다음과 같은 경우에 요소 유형이 다른 요소 유형으로 강제 변환될 수 있습니다.

      • 두 유형 모두 숫자인 경우. 다음과 같은 경우에 지원됩니다.

        • 둘 다 동일한 숫자 유형을 사용하지만 전체 자릿수 및/또는 소수 자릿수가 다를 수 있는 경우.

        • NUMBER를 FLOAT로 강제 변환하는 경우(그 반대도 마찬가지임).

      • 두 유형 모두 타임스탬프인 경우. 다음과 같은 경우에 지원됩니다.

        • 둘 다 동일한 유형을 사용하지만 전체 자릿수가 다를 수 있는 경우.

        • TIMESTAMP_LTZ를 TIMESTAMP_TZ로 강제 변환하는 경우(그 반대도 마찬가지임).

      예:

      • ARRAY(NUMBER)는 ARRAY(DOUBLE)로 강제 변환될 수 있습니다.

      • ARRAY(DATE)는 ARRAY(NUMBER)로 강제 변환될 수 없습니다.

    • 다음 조건이 모두 참인 경우에만 한 가지 유형 정의가 있는 OBJECT가 다른 유형 정의가 있는 OBJECT로 강제 변환될 수 있습니다.

      • 두 OBJECT 유형 모두 동일한 수의 키를 갖습니다.

      • 두 OBJECT 유형 모두 키에 동일한 이름을 사용합니다.

      • 두 OBJECT 유형에서 모두 키가 동일한 순서로 되어 있습니다.

      • 한 OBJECT 유형에서 각 값의 유형은 다른 OBJECT 유형의 해당 값 유형으로 강제 변환될 수 있습니다.

        정형 ARRAY의 요소 유형과 마찬가지로, 다음과 같은 경우에만 한 값의 유형을 다른 유형으로 강제 변환할 수 있습니다.

        • 두 유형 모두 숫자인 경우. 다음과 같은 경우에 지원됩니다.

          • 둘 다 동일한 숫자 유형을 사용하지만 전체 자릿수 및/또는 소수 자릿수가 다를 수 있는 경우.

          • NUMBER를 FLOAT로 강제 변환하는 경우(그 반대도 마찬가지임).

        • 두 유형 모두 타임스탬프인 경우. 다음과 같은 경우에 지원됩니다.

          • 둘 다 동일한 유형을 사용하지만 전체 자릿수가 다를 수 있는 경우.

          • TIMESTAMP_LTZ를 TIMESTAMP_TZ로 강제 변환하는 경우(그 반대도 마찬가지임).

      예:

      • OBJECT(city VARCHAR, zipcode NUMBER)는 OBJECT(city VARCHAR, zipcode DOUBLE)로 강제 변환될 수 있습니다.

      • OBJECT(city VARCHAR, zipcode NUMBER)는 OBJECT(city VARCHAR, zipcode DATE)로 강제 변환될 수 없습니다.

    • 다음과 같은 경우 값 유형이 하나인 MAP이 값 유형이 다른 MAP으로 강제 변환될 수 있습니다.

      • 두 값 유형 모두 숫자인 경우. 다음과 같은 경우에 지원됩니다.

        • 둘 다 동일한 숫자 유형을 사용하지만 전체 자릿수 및/또는 소수 자릿수가 다를 수 있는 경우.

        • NUMBER를 FLOAT로 강제 변환하는 경우(그 반대도 마찬가지임).

      • 두 값 유형 모두 타임스탬프인 경우. 다음과 같은 경우에 지원됩니다.

        • 둘 다 동일한 유형을 사용하지만 전체 자릿수가 다를 수 있는 경우.

        • TIMESTAMP_LTZ를 TIMESTAMP_TZ로 강제 변환하는 경우(그 반대도 마찬가지임).

      예를 들어, MAP(VARCHAR, NUMBER)는 MAP(VARCHAR, DOUBLE)으로 강제 변환될 수 있습니다.

    • 두 키 유형 모두 전체 자릿수만 다른 동일한 정수 NUMERIC 유형을 사용하는 경우 키 유형이 하나인 MAP은 키 유형이 다른 MAP으로 강제 변환될 수 있습니다.

      예를 들어, MAP(VARCHAR, NUMBER)는 MAP(NUMBER, NUMBER)으로 강제 변환될 수 없습니다.

  • 정형 유형은 반정형 오브젝트로 강제 변환될 수 없습니다(그 반대도 마찬가지임).

  • VARCHAR 값은 정형 유형으로 강제 변환될 수 없습니다.

한 정형 유형에서 다른 정형 유형으로 캐스팅하기

CAST 함수를 호출하거나 :: 연산자를 사용하여 한 정형 유형에서 다른 정형 유형으로 캐스팅할 수 있습니다. 다음 정형 유형 간에 캐스팅할 수 있습니다.

참고

TRY_CAST는 정형 유형에서는 지원되지 않습니다.

한 유형에서 다른 유형으로 값을 캐스팅할 수 없으면 캐스트가 실패합니다. 예를 들어, ARRAY(BOOLEAN)을 ARRAY(DATE)로 캐스팅하려는 시도는 실패합니다.

예: ARRAY의 한 유형에서 다른 유형으로 캐스팅하기

다음 예에서는 ARRAY(NUMBER)를 ARRAY(VARCHAR)로 캐스팅합니다.

SELECT CAST(
  CAST([1,2,3] AS ARRAY(NUMBER))
  AS ARRAY(VARCHAR)
);
Copy

예: OBJECT에서 키-값 페어의 순서 변경하기

다음 예에서는 정형 OBJECT에서 키-값 페어의 순서를 변경합니다.

SELECT CAST(
  {'city': 'San Mateo','state': 'CA'}::OBJECT(city VARCHAR, state VARCHAR)
  AS OBJECT(state VARCHAR, city VARCHAR)
);
Copy

예: OBJECT에서 키 이름 변경하기

정형 OBJECT의 키 이름을 변경하려면 CAST 끝에 RENAME FIELDS 키워드를 지정하십시오. 예:

SELECT CAST({'city':'San Mateo','state': 'CA'}::OBJECT(city VARCHAR, state VARCHAR)
  AS OBJECT(city_name VARCHAR, state_name VARCHAR) RENAME FIELDS);
Copy
+------------------------------------------------------------------------------+
| CAST({'CITY':'SAN MATEO','STATE': 'CA'}::OBJECT(CITY VARCHAR, STATE VARCHAR) |
|   AS OBJECT(CITY_NAME VARCHAR, STATE_NAME VARCHAR) RENAME FIELDS)            |
|------------------------------------------------------------------------------|
| {                                                                            |
|   "city_name": "San Mateo",                                                  |
|   "state_name": "CA"                                                         |
| }                                                                            |
+------------------------------------------------------------------------------+

예: OBJECT에 키 추가하기

캐스팅하려는 유형에 원래 정형 오브젝트에 없는 추가 키-값 페어가 있는 경우 CAST 끝에 ADD FIELDS 키워드를 지정하십시오. 예:

SELECT CAST({'city':'San Mateo','state': 'CA'}::OBJECT(city VARCHAR, state VARCHAR)
  AS OBJECT(city VARCHAR, state VARCHAR, zipcode NUMBER) ADD FIELDS);
Copy
+------------------------------------------------------------------------------+
| CAST({'CITY':'SAN MATEO','STATE': 'CA'}::OBJECT(CITY VARCHAR, STATE VARCHAR) |
|   AS OBJECT(CITY VARCHAR, STATE VARCHAR, ZIPCODE NUMBER) ADD FIELDS)         |
|------------------------------------------------------------------------------|
| {                                                                            |
|   "city": "San Mateo",                                                       |
|   "state": "CA",                                                             |
|   "zipcode": null                                                            |
| }                                                                            |
+------------------------------------------------------------------------------+

새로 추가된 키의 값은 NULL로 설정됩니다. 이러한 키에 값을 할당하려면 대신 OBJECT_INSERT 함수를 호출하십시오.

정형 ARRAY, 정형 OBJECT 및 MAP 생성하기

다음 섹션에서는 정형 ARRAY, 정형 OBJECT 및 MAP을 생성하는 방법을 설명합니다.

SQL 함수를 사용하여 정형 ARRAY 및 OBJECT 생성하기

다음 함수는 반정형 ARRAY를 생성합니다.

다음 함수는 반정형 OBJECT를 생성합니다.

정형 ARRAY 또는 OBJECT를 생성하려면 이러한 함수를 사용하고 함수의 반환 값을 명시적으로 캐스팅하십시오. 예:

SELECT ARRAY_CONSTRUCT(10, 20, 30)::ARRAY(NUMBER);
Copy
SELECT OBJECT_CONSTRUCT(
  'name', 'abc',
  'created_date', '2020-01-18'::DATE
)::OBJECT(
  name VARCHAR,
  created_date DATE
);
Copy

자세한 내용은 반정형 유형을 정형 유형으로 명시적으로 캐스팅하기 섹션을 참조하십시오.

참고

정형 ARRAY, 정형 OBJECT 또는 MAP을 이러한 함수에 전달할 수 없습니다. 그렇게 하면 정형 유형이 반정형 유형으로 암시적으로 캐스팅되는데, (값을 암시적으로 캐스팅하기(강제 변환) 에 언급된 대로) 이는 허용되지 않습니다.

ARRAY 및 OBJECT 상수를 사용하여 정형 ARRAY 및 OBJECT 생성하기

ARRAY 상수 또는 OBJECT 상수 를 지정하면 반정형 ARRAY 또는 OBJECT를 지정하게 됩니다.

정형 ARRAY 또는 OBJECT를 생성하려면 식을 명시적으로 캐스팅해야 합니다. 예:

SELECT [10, 20, 30]::ARRAY(NUMBER);
Copy
SELECT {
  'name': 'abc',
  'created_date': '2020-01-18'::DATE
}::OBJECT(
  name VARCHAR,
  created_date DATE
);
Copy

자세한 내용은 반정형 유형을 정형 유형으로 명시적으로 캐스팅하기 섹션을 참조하십시오.

MAP 구성하기

MAP을 생성하려면 반정형 오브젝트를 생성하고 OBJECT를 MAP으로 캐스팅합니다.

예를 들어 다음 문은 모두 MAP {'city'->'San Mateo','state'->'CA'} 를 생성합니다.

SELECT OBJECT_CONSTRUCT(
  'city', 'San Mateo',
  'state', 'CA'
)::MAP(
  VARCHAR,
  VARCHAR
);
Copy
SELECT {
  'city': 'San Mateo',
  'state': 'CA'
}::MAP(
  VARCHAR,
  VARCHAR
);
Copy

다음 문은 MAP {-10->'CA',-20->'OR'} 를 생성합니다.

SELECT {
  '-10': 'CA',
  '-20': 'OR'
}::MAP(
  NUMBER,
  VARCHAR
)
Copy

자세한 내용은 반정형 OBJECT 및 VARIANT를 MAP으로 캐스팅하기 섹션을 참조하십시오.

정형 유형의 키, 값 및 요소 사용하기

다음 섹션에서는 정형 유형의 값과 요소를 사용하는 방법을 설명합니다.

정형 OBJECT에서 키 목록 가져오기

정형 OBJECT의 키 목록을 가져오려면 OBJECT_KEYS 함수를 호출하십시오.

SELECT OBJECT_KEYS({'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR, state VARCHAR));
Copy

입력값이 정형 OBJECT인 경우 함수는 키가 포함된 ARRAY(VARCHAR)를 반환합니다. 입력값이 반정형 OBJECT인 경우 함수는 ARRAY를 반환합니다.

MAP에서 키 목록 가져오기

MAP의 키 목록을 가져오려면 MAP_KEYS 함수를 호출하십시오.

SELECT MAP_KEYS({'my_key':'my_value'}::MAP(VARCHAR,VARCHAR));
Copy

정형 유형의 값 및 요소에 액세스하기

다음 메서드를 사용하여 정형 ARRAY, 정형 OBJECT, MAP의 값과 요소에 액세스할 수 있습니다.

반환된 값과 요소에는 VARIANT이 아닌 오브젝트에 대해 지정된 유형이 있습니다.

다음 예에서는 반정형 ARRAY 및 ARRAY(VARCHAR)의 첫 번째 요소를 SYSTEM$TYPEOF 함수에 전달하여 해당 요소의 데이터 타입을 반환합니다.

SELECT
  SYSTEM$TYPEOF(
    ARRAY_CONSTRUCT('San Mateo')[0]
  ) AS semi_structured_array_element,
  SYSTEM$TYPEOF(
    CAST(
      ARRAY_CONSTRUCT('San Mateo') AS ARRAY(VARCHAR)
    )[0]
  ) AS structured_array_element;
Copy
+-------------------------------+-----------------------------+
| SEMI_STRUCTURED_ARRAY_ELEMENT | STRUCTURED_ARRAY_ELEMENT    |
|-------------------------------+-----------------------------|
| VARIANT[LOB]                  | VARCHAR(16777216)[LOB]      |
+-------------------------------+-----------------------------+

다음 사항을 참고하십시오.

  • 정형 OBJECT를 GET 또는 GET_IGNORE_CASE 함수에 전달할 때 키에 대한 상수를 지정해야 합니다.

    MAP 또는 정형 ARRAY를 GET 함수에 전달하는 경우 상수를 지정할 필요가 없습니다.

    MAP을 GET_IGNORE_CASE 함수에 전달하는 경우에도 상수를 지정할 필요가 없습니다.

  • 정형 OBJECT, 정형 ARRAY 또는 MAP을 GET_PATH 함수에 전달할 때 경로 이름에 대한 상수를 지정해야 합니다.

  • 정형 오브젝트의 경우 존재하지 않는 경로 또는 OBJECT 키를 사용하면 컴파일 시간 오류가 발생합니다.

    반면, 반정형 오브젝트에 존재하지 않는 인덱스, 키 또는 경로를 사용하는 경우 함수는 NULL을 반환합니다.

정형 ARRAY의 크기 확인하기

정형 ARRAY의 크기를 확인하려면 ARRAY를 ARRAY_SIZE 함수에 전달하십시오.

SELECT ARRAY_SIZE([1,2,3]::ARRAY(NUMBER));
Copy

MAP의 크기 확인하기

MAP의 크기를 확인하려면 MAP을 MAP_SIZE 함수에 전달하십시오.

SELECT MAP_SIZE({'my_key':'my_value'}::MAP(VARCHAR,VARCHAR));
Copy

정형 ARRAY에서 요소 조회하기

정형 ARRAY에 요소가 있는지 확인하려면 ARRAY_CONTAINS 함수를 호출하십시오. 예:

SELECT ARRAY_CONTAINS(10, [1, 10, 100]::ARRAY(NUMBER));
Copy

정형 ARRAY에서 요소의 위치를 확인하려면 ARRAY_POSITION 함수를 호출하십시오. 예:

SELECT ARRAY_POSITION(10, [1, 10, 100]::ARRAY(NUMBER));
Copy

참고

두 함수 모두 ARRAY 유형과 비교할 수 있는 유형 의 요소를 사용합니다.

요소의 식을 VARIANT로 캐스팅하지 마십시오.

MAP에 키가 포함되어 있는지 확인하기

MAP에 키가 포함되어 있는지 확인하려면 MAP_CONTAINS_KEY 함수를 호출하십시오.

예:

SELECT MAP_CONTAINS_KEY('key_to_find', my_map);
Copy
SELECT MAP_CONTAINS_KEY(10, my_map);
Copy

오브젝트 비교하기

다음 섹션에서는 오브젝트를 비교하는 방법을 설명합니다.

정형 오브젝트와 반정형 오브젝트 비교하기

정형 ARRAY, 정형 OBJECT 또는 MAP을 반정형 ARRAY, OBJECT 또는 VARIANT와 비교할 수 없습니다.

정형 오브젝트와 다른 정형 오브젝트 비교하기

동일한 유형의 두 오브젝트를 비교할 수 있습니다(예: 정형 ARRAY 2개, 정형 OBJECT 2개 또는 MAP 2개).

현재, 정형 유형을 비교하기 위해 다음과 같은 비교 연산자가 지원됩니다.

  • =

  • !=

  • <

  • <=

  • >=

  • >

두 정형 오브젝트가 동일한지 비교할 때 다음 사항에 유의하십시오.

  • 한 유형을 다른 유형으로 강제 변환 할 수 없으면 비교가 실패합니다.

  • 숫자 키가 있는 MAP을 비교할 때 키는 (VARCHAR 값이 아니라) 숫자로 비교됩니다.

<, <=, >= 또는 > 을 사용하여 두 정형 오브젝트를 비교할 때 정형 오브젝트 필드는 사전순으로 비교됩니다. 예를 들어 다음 오브젝트는

{'a':2,'b':1}::OBJECT(b INTEGER,a INTEGER)
Copy

다음 오브젝트보다 큽니다.

{'a':1,'b':2}::OBJECT(b INTEGER,a INTEGER)
Copy

두 ARRAY의 중첩 여부 확인하기

정형 ARRAY 2개로 구성된 요소가 중첩되는지 확인해야 하는 경우 ARRAYS_OVERLAP 함수를 호출하십시오. 예:

SELECT ARRAYS_OVERLAP(numeric_array, other_numeric_array);
Copy

ARRAY는 비교 가능한 유형 이어야 합니다.

반정형 ARRAY 및 정형 ARRAY를 이 함수에 전달할 수 없습니다. 두 ARRAY 모두 정형 또는 반정형 중 하나여야 합니다.

정형 유형 변환하기

다음 섹션에서는 정형 ARRAY, 정형 OBJECT 및 MAP을 변환하는 방법을 설명합니다.

정형 ARRAY 변환하기

정형 ARRAY를 이러한 함수에 전달하면 함수는 동일한 유형의 정형 ARRAY를 반환합니다.

다음 섹션에서는 이러한 함수가 정형 ARRAY에서 작동하는 방식을 설명합니다.

배열에 요소를 추가하는 함수

다음 함수는 ARRAY에 요소를 추가합니다.

이러한 함수의 경우 요소 유형은 ARRAY 유형으로 강제 변환 가능 해야 합니다.

예를 들어, 다음 호출은 NUMBER가 DOUBLE(ARRAY 유형)로 강제 변환될 수 있으므로 성공합니다.

SELECT ARRAY_APPEND( [1,2]::ARRAY(DOUBLE), 3::NUMBER );
Copy

다음 호출은 VARCHAR이 DOUBLE로 강제 변환될 수 있으므로 성공합니다.

SELECT ARRAY_APPEND( [1,2]::ARRAY(DOUBLE), '3' );
Copy

DATE를 NUMBER로 강제 변환될 수 없으므로 다음 호출은 실패합니다.

SELECT ARRAY_APPEND( [1,2]::ARRAY(NUMBER), '2022-02-02'::DATE );
Copy

여러 ARRAY를 입력으로 허용하는 함수

다음 함수는 여러 ARRAY를 입력 인자로 허용합니다.

이러한 함수를 호출할 때 두 인자 모두 정형 ARRAY 또는 반정형 ARRAY여야 합니다. 예를 들어 다음 호출은 한 인자가 정형 ARRAY이고 다른 인자가 반정형 ARRAY이므로 실패합니다.

SELECT ARRAY_CAT( [1,2]::ARRAY(NUMBER), ['3','4'] );
Copy
SELECT ARRAY_CAT( [1,2], ['3','4']::ARRAY(VARCHAR) );
Copy

ARRAY_EXCEPT 함수는 첫 번째 인자의 ARRAY와 동일한 유형의 ARRAY를 반환합니다.

ARRAY_CAT 및 ARRAY_INTERSECTION 함수는 두 입력 유형을 모두 수용할 수 있는 유형의 ARRAY를 반환합니다.

예를 들어, ARRAY_CAT에 대한 다음 호출은 2개의 정형 ARRAY를 전달합니다.

  • 첫 번째 정형 ARRAY는 NULL을 허용하지 않으며 소수 자릿수가 0인 NUMBER 값을 포함합니다. (NUMBER는 NUMBER(38, 0)입니다.)

  • 두 번째 정형 ARRAY는 NULL과 소수 자릿수가 1인 숫자를 포함합니다.

ARRAY_CAT에서 반환된 ARRAY는 NULL을 허용하며 소수 자릿수가 1인 NUMBER 값을 포함합니다.

SELECT
  ARRAY_CAT(
    [1, 2, 3]::ARRAY(NUMBER NOT NULL),
    [5.5, NULL]::ARRAY(NUMBER(2, 1))
  ) AS concatenated_array,
  SYSTEM$TYPEOF(concatenated_array);
Copy
+--------------------+-----------------------------------+
| CONCATENATED_ARRAY | SYSTEM$TYPEOF(CONCATENATED_ARRAY) |
|--------------------+-----------------------------------|
| [                  | ARRAY(NUMBER(38,1))[LOB]          |
|   1,               |                                   |
|   2,               |                                   |
|   3,               |                                   |
|   5.5,             |                                   |
|   undefined        |                                   |
| ]                  |                                   |
+--------------------+-----------------------------------+

ARRAY_CAT 함수의 경우 두 번째 인자의 ARRAY는 첫 번째 인자의 유형으로 강제 변환 가능 해야 합니다.

ARRAY_EXCEPT 및 ARRAY_INTERSECTION 함수의 경우 두 번째 인자의 ARRAY는 첫 번째 인자의 ARRAY와 비교 가능 해야 합니다.

예를 들어, 다음 호출은 ARRAY(NUMBER)가 ARRAY(DOUBLE)과 비교 가능하므로 성공합니다.

SELECT ARRAY_EXCEPT( [1,2]::ARRAY(NUMBER), [2,3]::ARRAY(DOUBLE) );
Copy

다음 호출은 ARRAY(NUMBER)가 ARRAY(VARCHAR)과 비교할 수 없으므로 실패합니다.

SELECT ARRAY_EXCEPT( [1,2]::ARRAY(NUMBER), ['2','3']::ARRAY(VARCHAR) );
Copy

정형 OBJECT 변환하기

다음 섹션에서는 다른 OBJECT에서 변환된 정형 OBJECT를 반환하는 방법을 설명합니다.

키-값 페어의 순서를 변경하거나, 키 이름을 바꾸거나, 값을 지정하지 않고 키를 추가해야 하는 경우에는 CAST 함수 또는 :: 연산자 를 사용하십시오. 자세한 내용은 한 정형 유형에서 다른 정형 유형으로 캐스팅하기 섹션을 참조하십시오.

키-값 페어 제거하기

특정 키-값 페어가 제거된 기존 오브젝트의 키-값 페어를 포함하는 새 오브젝트를 반환하려면 OBJECT_DELETE 함수를 호출하십시오.

이 함수를 호출할 때 다음 사항에 유의하십시오.

  • 키인 인자의 경우 상수를 지정해야 합니다.

  • 지정된 키가 OBJECT 유형 정의에 포함되지 않는 경우 호출이 실패합니다. 예를 들어, 다음 호출은 OBJECT에 지정된 키 zip_code 가 포함되어 있지 않으므로 실패합니다.

    SELECT OBJECT_DELETE( {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR), 'zip_code' );
    
    Copy
    093201 (23001): Function OBJECT_DELETE: expected structured object to contain field zip_code but it did not.
    
  • 이 함수는 정형 OBJECT를 반환합니다. OBJECT 유형은 삭제된 키를 제외합니다. 예를 들어, city 키를 제거한다고 가정해 보겠습니다.

    SELECT
      OBJECT_DELETE(
        {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR),
        'city'
      ) AS new_object,
      SYSTEM$TYPE_OF(new_object);
    
    Copy

    이 함수는 city 키를 포함하지 않는 OBJECT(state VARCHAR) 유형의 OBJECT를 반환합니다.

    +-----------------+--------------------------------------+
    | NEW_OBJECT      | SYSTEM$TYPEOF(NEW_OBJECT)            |
    |-----------------+--------------------------------------|
    | {               | OBJECT(state VARCHAR(16777216))[LOB] |
    |   "state": "CA" |                                      |
    | }               |                                      |
    +-----------------+--------------------------------------+
    
  • 이 함수는 오브젝트에서 모든 키를 제거할 경우 OBJECT() 유형의 빈 정형 OBJECT를 반환합니다.

    SELECT
      OBJECT_DELETE(
        {'state':'CA'}::OBJECT(state VARCHAR),
        'state'
      ) AS new_object,
      SYSTEM$TYPEOF(new_object);
    
    Copy
    +------------+---------------------------+
    | NEW_OBJECT | SYSTEM$TYPEOF(NEW_OBJECT) |
    |------------+---------------------------|
    | {}         | OBJECT()[LOB]             |
    +------------+---------------------------+
    

    정형 OBJECT의 유형에 키-값 페어가 포함된 경우 해당 페어의 이름과 유형이 유형의 괄호 안에 포함됩니다(예: OBJECT(city VARCHAR)). 빈 정형 OBJECT에는 키-값 페어가 포함되어 있지 않으므로 괄호는 비어 있습니다.

키-값 페어 삽입 및 값 업데이트하기

추가 키-값 페어 또는 새 키 값이 있는 기존 오브젝트의 키-값 페어를 포함하는 새 오브젝트를 반환하려면 OBJECT_INSERT 함수를 호출하십시오.

이 함수를 호출할 때 다음 사항에 유의하십시오.

  • 키인 인자의 경우 상수를 지정해야 합니다.

  • updateFlag 인자가 FALSE인 경우(새 키-값 페어를 삽입하는 경우):

    • OBJECT에 이미 존재하는 키를 지정하면 오류가 발생합니다.

      SELECT OBJECT_INSERT(
        {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR),
        'city',
        'San Jose',
        false
      );
      
      Copy
      093202 (23001): Function OBJECT_INSERT:
        expected structured object to not contain field city but it did.
      
    • 이 함수는 정형 OBJECT를 반환합니다. OBJECT의 유형에는 새로 삽입된 키가 포함됩니다. 예를 들어, DOUBLE 값 94402 를 사용하여 zipcode 키를 추가한다고 가정해 보겠습니다.

      SELECT
        OBJECT_INSERT(
          {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR),
          'zip_code',
          94402::DOUBLE,
          false
        ) AS new_object,
        SYSTEM$TYPEOF(new_object);
      
      Copy

      이 함수는 OBJECT(city VARCHAR, state VARCHAR, zipcode DOUBLE) 유형의 OBJECT를 반환합니다.

      +-------------------------------------+---------------------------------------------------------------------------------------+
      | NEW_OBJECT                          | SYSTEM$TYPEOF(NEW_OBJECT)                                                             |
      |-------------------------------------+---------------------------------------------------------------------------------------|
      | {                                   | OBJECT(city VARCHAR(16777216), state VARCHAR(16777216), zip_code FLOAT NOT NULL)[LOB] |
      |   "city": "San Mateo",              |                                                                                       |
      |   "state": "CA",                    |                                                                                       |
      |   "zip_code": 9.440200000000000e+04 |                                                                                       |
      | }                                   |                                                                                       |
      +-------------------------------------+---------------------------------------------------------------------------------------+
      

      삽입된 값의 유형에 따라 OBJECT 유형 정의에 추가된 유형이 결정됩니다. 이 경우 zipcode 의 값은 DOUBLE에 캐스팅된 값이므로 zipcode 의 유형은 DOUBLE입니다.

  • updateFlag 인자가 TRUE인 경우(기존 키-값 페어를 바꾸는 경우):

    • OBJECT에 존재하지 않는 키를 지정하면 오류가 발생합니다.

    • 이 함수는 동일한 유형의 정형 OBJECT를 반환합니다.

    • 삽입된 값의 유형은 기존 키 유형으로 강제 변환됩니다.

기존 OBJECT에서 키-값 페어 선택하기

기존 오브젝트에서 선택한 키-값 페어를 포함하는 새 오브젝트를 반환하려면 OBJECT_PICK 함수를 호출하십시오.

이 함수를 호출할 때 다음 사항에 유의하십시오.

  • 키인 인자의 경우 상수를 지정해야 합니다.

  • 키로 구성된 ARRAY를 두 번째 인자로 전달할 수 없습니다. 각 키를 별도의 인자로 지정해야 합니다.

  • 이 함수는 정형 OBJECT를 반환합니다. OBJECT 유형에는 지정된 순서대로 키가 포함됩니다.

    예를 들어, statecity 키를 순서대로 선택한다고 가정해 보겠습니다.

    SELECT
      OBJECT_PICK(
        {'city':'San Mateo','state':'CA','zip_code':94402}::OBJECT(city VARCHAR,state VARCHAR,zip_code DOUBLE),
        'state',
        'city') AS new_object,
      SYSTEM$TYPEOF(new_object);
    
    Copy

    이 함수는 OBJECT(state VARCHAR, city VARCHAR) 유형의 OBJECT를 반환합니다.

    +-----------------------+--------------------------------------------------------------+
    | NEW_OBJECT            | SYSTEM$TYPEOF(NEW_OBJECT)                                    |
    |-----------------------+--------------------------------------------------------------|
    | {                     | OBJECT(state VARCHAR(16777216), city VARCHAR(16777216))[LOB] |
    |   "state": "CA",      |                                                              |
    |   "city": "San Mateo" |                                                              |
    | }                     |                                                              |
    +-----------------------+--------------------------------------------------------------+
    

MAP 변환하기

MAP을 변환하려면 다음 함수를 사용하십시오.

정형 유형 사용하기

다음 섹션에서는 정형 유형의 오브젝트에 다양한 SQL 함수와 집합 연산자를 사용하는 방법을 설명합니다.

정형 유형과 함께 FLATTEN 함수 사용하기

정형 ARRAY, 정형 OBJECT, MAP을 FLATTEN 함수에 전달할 수 있습니다. 반정형 데이터 타입의 경우와 마찬가지로, PATH 인자를 사용하여 평면화되는 값을 지정할 수 있습니다.

  • 평면화되는 값이 정형 ARRAY이고 RECURSIVE 인자가 FALSE인 경우 value 열에는 ARRAY와 동일한 유형의 값이 포함됩니다.

    예:

    SELECT value, SYSTEM$TYPEOF(value)
      FROM TABLE(FLATTEN(INPUT => [1.08, 2.13, 3.14]::ARRAY(DOUBLE)));
    
    Copy
    +-------+----------------------+
    | VALUE | SYSTEM$TYPEOF(VALUE) |
    |-------+----------------------|
    |  1.08 | FLOAT[DOUBLE]        |
    |  2.13 | FLOAT[DOUBLE]        |
    |  3.14 | FLOAT[DOUBLE]        |
    +-------+----------------------+
    
  • 평면화되는 값이 MAP이고 RECURSIVE 인자가 FALSE인 경우 key 열에는 MAP 키와 동일한 유형의 키가 포함되고 value 열에는 MAP 값과 동일한 유형의 값이 포함됩니다.

    예:

    SELECT key, SYSTEM$TYPEOF(key), value, SYSTEM$TYPEOF(value)
      FROM TABLE(FLATTEN(INPUT => {'my_key': 'my_value'}::MAP(VARCHAR, VARCHAR)));
    
    Copy
    +--------+------------------------+----------+------------------------+
    | KEY    | SYSTEM$TYPEOF(KEY)     | VALUE    | SYSTEM$TYPEOF(VALUE)   |
    |--------+------------------------+----------+------------------------|
    | my_key | VARCHAR(16777216)[LOB] | my_value | VARCHAR(16777216)[LOB] |
    +--------+------------------------+----------+------------------------+
    
  • 그렇지 않으면 keyvalue 열의 유형은 VARIANT입니다.

MAP의 경우 반환된 키와 값의 순서가 불명확합니다.

PARSE_JSON 함수 사용하기

PARSE_JSON 함수는 정형 유형을 반환하지 않습니다.

집합 연산자 및 CASE 식과 함께 정형 유형 사용하기

다음 섹션에서 정형 ARRAY, 정형 OBJECT, MAP을 사용할 수 있습니다.

집합 연산자의 경우, 서로 다른 식에서 서로 다른 유형이 사용되는 경우(예: 한 유형이 ARRAY(NUMBER)이고 다른 유형이 ARRAY(DOUBLE)인 경우) 한 유형이 다른 유형으로 강제 변환됩니다.

다른 반정형 함수 사용하기

다음 함수는 정형 ARRAY, 정형 OBJECT 또는 MAP을 입력 인자로 허용하지 않습니다.

정형 유형을 입력값으로 전달하면 오류가 발생합니다.

드라이버를 사용하여 애플리케이션에서 정형 유형에 액세스하기

드라이버(예: ODBC 또는 JDBC 드라이버, Python용 Snowflake 커넥터 등)를 사용하는 애플리케이션에서는 정형 유형 값이 반정형 유형으로 반환됩니다. 예:

  • 정형 ARRAY 열은 반정형 ARRAY로 클라이언트 애플리케이션에 반환됩니다.

  • 정형 OBJECT 또는 MAP 열은 반정형 OBJECT로 클라이언트 애플리케이션에 반환됩니다.

사용자 정의 함수(UDF) 및 저장 프로시저와 함께 정형 유형 사용하기

SQL 또는 Snowflake Scripting 에서 사용자 정의 함수(UDF), 사용자 정의 테이블 함수(UDTF) 또는 저장 프로시저를 생성할 때 인자와 반환 값에 정형 유형을 사용할 수 있습니다. 예:

CREATE OR REPLACE FUNCTION my_udf(
    location OBJECT(city VARCHAR, zipcode NUMBER, val ARRAY(BOOLEAN)))
  RETURNS VARCHAR
  AS
  $$
    ...
  $$;
Copy
CREATE OR REPLACE FUNCTION my_udtf(check BOOLEAN)
  RETURNS TABLE(col1 ARRAY(VARCHAR))
  AS
  $$
  ...
  $$;
Copy
CREATE OR REPLACE PROCEDURE my_procedure(values ARRAY(INTEGER))
  RETURNS ARRAY(INTEGER)
  LANGUAGE SQL
  AS
  $$
    ...
  $$;
Copy

참고

정형 유형은 아직 다른 언어(Java, JavaScript, Python, Scala)로 작성된 UDF, UDTF 및 저장 프로시저에서 지원되지 않습니다.

정형 유형에 대한 정보 보기

다음 섹션에서는 정형 유형에 대한 정보를 보는 데 사용할 수 있는 뷰와 명령에 대해 설명합니다.

SHOW COLUMNS 명령을 사용하여 정형 유형 정보 보기

SHOW COLUMNS 명령의 출력에서 data_type 열에는 요소, 키, 값의 유형에 대한 정보가 포함됩니다.

DESCRIBE 및 기타 SHOW 명령을 사용하여 정형 유형 정보 보기

다음 명령의 출력에는 정형 유형에 대한 정보가 포함됩니다.

예를 들어, DESCRIBE RESULT 출력에서 MAP(VARCHAR, VARCHAR) 열의 행에는 type 열에 다음 값이 포함됩니다.

map(VARCHAR(16777216), VARCHAR(16777216))
Copy

ARRAY(NUMBER) 열의 행에는 type 열에 다음 값이 포함됩니다.

ARRAY(NUMBER(38,0))
Copy

데이터베이스에 사용된 정형 유형에 대한 정보 보기

정형 유형 열의 경우 INFORMATION_SCHEMA COLUMNS 뷰 는 열의 기본 데이터 타입(ARRAY, OBJECT 또는 MAP)에 대한 정보만 제공합니다.

예를 들어, data_type 열에는 《ARRAY》, 《OBJECT》 또는 《MAP》만 포함됩니다. 열에는 요소, 키 또는 값의 유형이 포함되지 않습니다.

요소, 키, 값의 유형에 대한 정보를 보려면 다음 뷰를 사용하십시오.