정형 데이터 타입¶
Snowflake 구조 유형은 ARRAY, OBJECT, MAP 입니다. 정형 유형에는 특정 Snowflake 데이터 타입 을 가진 요소 또는 키-값 페어가 포함됩니다. 다음은 정형 유형의 예입니다.
INTEGER개 요소로 구성된 ARRAY.
VARCHAR 및 NUMBER 키-값 페어가 있는 OBJECT.
VARCHAR 키를 DOUBLE 값과 연결하는 MAP.
다음과 같은 방법으로 정형 유형을 사용할 수 있습니다.
Apache Iceberg™ 테이블 에서 정형 유형 열을 정의할 수 있습니다.
Apache Iceberg™ 데이터 타입
list
,struct
,map
은 Snowflake의 정형 ARRAY, 정형 OBJECT, MAP 유형에 해당합니다.정형 유형 열은 최대 1,000개의 하위 열을 지원합니다.
Iceberg 테이블의 정형 유형 열에서 데이터에 액세스할 때 정형 유형을 사용합니다.
반정형 ARRAY, OBJECT 또는 VARIANT 값을 해당 정형 유형(예: ARRAY 값을 INTEGER 요소의 ARRAY 값으로)으로 형 변환할 수 있습니다. 반정형 유형의 정형 유형을 캐스팅할 수도 있습니다.
참고
현재 Iceberg 테이블 이외의 테이블은 정형 유형을 지원하지 않습니다. 정형 유형의 열은 일반 테이블에 추가할 수 없습니다.
이 항목에서는 Snowflake에서 정형 유형을 사용하는 방법을 설명합니다.
정형 유형 지정하기¶
정형 유형 열을 정의하거나 값을 정형 유형으로 캐스팅할 때 다음 섹션에 설명된 구문을 사용하십시오.
정형 ARRAY 타입 지정하기¶
정형 ARRAY 유형을 지정하려면 다음 구문을 사용합니다.
ARRAY( <element_type> [ NOT NULL ] )
여기서
element_type
은 이 ARRAY에 있는 요소의 Snowflake 데이터 타입 입니다.정형 ARRAY, 정형 OBJECT 또는 MAP을 요소 유형으로 지정할 수도 있습니다.
참고
Iceberg 테이블 열의 정의에서 ARRAY 요소의 유형으로 VARIANT, 반정형 ARRAY 또는 반정형 OBJECT 를 지정할 수 없습니다.
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;
+-------------------------------+-----------------------+
| 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 ] ]
[ , ... ]
]
)
여기서
key
는 OBJECT 유형의 키를 지정합니다.OBJECT 정의의 각
key
는 고유해야 합니다.키의 순서는 OBJECT 정의의 일부입니다. 키가 같은 두 개의 OBJECT 값을 다른 순서로 비교하는 것은 허용되지 않습니다. (컴파일 시간 오류가 발생합니다.)
키를 지정하지 않고 괄호를 지정하는 경우(즉,
OBJECT()
)를 사용하면 결과 유형은 키가 포함되지 않은 정형 OBJECT 가 됩니다. 키가 없는 정형 OBJECT는 반정형 OBJECT와는 다릅니다.
value_type
은 키에 해당하는 값의 Snowflake 데이터 타입 입니다.정형 ARRAY, 정형 OBJECT 또는 MAP을 값 유형으로 지정할 수도 있습니다.
참고
Iceberg 테이블 열의 정의에서 OBJECT 키에 해당하는 값의 유형으로 VARIANT, 반정형 ARRAY 또는 반정형 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;
+---------------------------------------------------------------+------------------------+
| STRUCTURED_OBJECT | SEMI_STRUCTURED_OBJECT |
|---------------------------------------------------------------+------------------------|
| OBJECT(str VARCHAR(16777216) NOT NULL, num NUMBER(38,0))[LOB] | OBJECT[LOB] |
+---------------------------------------------------------------+------------------------+
MAP 타입 지정하기¶
MAP 타입을 지정하려면 다음 구문을 사용합니다.
MAP( <key_type> , <value_type> [ NOT NULL ] )
여기서
key_type
은 맵 키의 Snowflake 데이터 타입 입니다. 키에는 다음 유형 중 하나를 사용해야 합니다.VARCHAR
소수 자릿수가 0인 NUMBER
부동 소수점 데이터 타입을 키의 타입으로 사용할 수 없습니다.
매핑 키는 NULL 일 수 없습니다.
value_type
은 맵에 있는 값의 Snowflake 데이터 타입 입니다.정형 ARRAY, 정형 OBJECT 또는 MAP을 값 유형으로 지정할 수도 있습니다.
참고
Iceberg 테이블 열 정의에서는 VARIANT, 반정형 ARRAY 또는 반정형 OBJECT 를 MAP 의 값 유형으로 지정할 수 없습니다.
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;
+------------------------------------------------+
| MAP_EXAMPLE |
|------------------------------------------------|
| MAP(VARCHAR(16777216), VARCHAR(16777216))[LOB] |
+------------------------------------------------+
반정형 유형에서 정형 유형 사용하기¶
MAP, 정형 OBJECT, 정형 ARRAY 값은 VARIANT, 반정형 OBJECT, 반정형 ARRAY 값에 사용할 수 없습니다. 다음 상황에서는 오류가 발생합니다.
정형 유형과 반정형 유형 변환하기¶
다음 표에는 정형 OBJECT, 정형 ARRAY, MAP 을 반정형 OBJECT, ARRAY, VARIANT 값(그 반대도 마찬가지임)으로 변환 하는 규칙이 요약되어 있습니다.
소스 데이터 타입 |
대상 데이터 타입 |
||
---|---|---|---|
반정형 ARRAY |
정형 ARRAY |
✔ |
❌ |
반정형 OBJECT |
|
✔ |
❌ |
반정형 VARIANT |
|
✔ |
❌ |
정형 ARRAY |
반정형 ARRAY |
✔ |
❌ |
|
반정형 OBJECT |
✔ |
❌ |
|
반정형 VARIANT |
✔ |
❌ |
다음 섹션에서는 이러한 규칙을 더 자세히 설명합니다.
반정형 유형을 정형 유형으로 명시적으로 캐스팅하기¶
반정형 타입의 값을 정형 타입의 값으로 명시적으로 형 변환하려면 CAST 함수를 호출하거나 :: 연산자 를 사용하면 됩니다.
참고
TRY_CAST 는 정형 유형에는 지원되지 않습니다.
다음 반정형 타입의 값은 해당 정형 타입의 값으로만 형 변환할 수 있으며, 그렇지 않으면 런타임 오류가 발생합니다.
반정형 유형 |
형 변환할 수 있는 대상 정형 유형 |
---|---|
ARRAY |
정형 ARRAY |
OBJECT |
MAP 또는 정형 OBJECT |
VARIANT |
MAP 또는 정형 ARRAY 또는 OBJECT |
다음 섹션에서는 유형이 캐스팅되는 방법에 대한 자세한 내용을 제공합니다.
반정형 ARRAY 및 VARIANT 값을 정형 ARRAY 값으로 형 변환하기¶
다음 단계는 반정형 ARRAY 또는 VARIANT 값을 ARRAY 값의 NUMBER 요소로 형 변환하는 방법을 보여줍니다.
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;
또는:
SELECT
SYSTEM$TYPEOF(
[1,2,3]::ARRAY(NUMBER)
) AS array_cast_type,
SYSTEM$TYPEOF(
[1,2,3]::VARIANT::ARRAY(NUMBER)
) AS variant_cast_type;
+--------------------------+--------------------------+
| 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;
+---------------+-------------------------------+ | 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을 지원하지 않는 경우(즉, 대상 유형이 반정형 ARRAY, OBJECT 또는 VARIANT가 아닌 경우) JSON null 값인 요소 는 NULL 로 변환됩니다.
예를 들어, ARRAY(NUMBER)로 형 변환하는 경우 NUMBER 는 JSON null을 지원하지 않으므로 JSON null 값은 NULL 로 변환됩니다.
반면에 ARRAY (VARIANT)로 형 변환하는 경우 VARIANT 는 JSON null을 지원하므로 JSON null 값은 NULL 로 변환되지 않습니다.
반정형 OBJECT 및 VARIANT 값을 정형 OBJECT 값으로 형 변환하기¶
다음 단계에서는 반정형 OBJECT 또는 VARIANT 값을 city
및 state
키-값 페어(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;
또는:
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;
+--------------------------------------------------------------+--------------------------------------------------------------+
| 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(도시 VARCHAR)로 형 변환하는 경우 VARCHAR 은 JSON null을 지원하지 않으므로 JSON null 값은 NULL 로 변환됩니다.
반면에 OBJECT(도시 VARIANT)로 형 변환하는 경우 JSON null 값은 NULL 로 변환되지 않는데, 이는 VARIANT 가 JSON 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;
또는:
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;
+------------------------------------------------+------------------------------------------------+
| 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 ASVARIANT)는 반정형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;
+---------------------------------------+ | [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) 값으로 강제 지정할 수 없습니다.
다음 조건이 모두 true인 경우에만 한 가지 유형 정의가 있는 OBJECT 값은 다른 유형 정의가 있는 OBJECT 값으로 강제 변환될 수 있습니다.
두 OBJECT 유형 모두 동일한 수의 키를 갖습니다.
두 OBJECT 유형 모두 키에 동일한 이름을 사용합니다.
두 OBJECT 유형에서 모두 키가 동일한 순서로 되어 있습니다.
한 OBJECT 유형에서 각 값의 유형은 다른 OBJECT 유형의 해당 값 유형으로 강제 변환될 수 있습니다.
정형 ARRAY 값의 요소 유형과 마찬가지로, 다음과 같은 경우에만 한 값의 유형을 다른 유형으로 강제로 변경할 수 있습니다.
두 유형 모두 숫자인 경우. 다음과 같은 경우에 지원됩니다.
둘 다 동일한 숫자 유형을 사용하지만 전체 자릿수 및/또는 소수 자릿수가 다를 수 있는 경우.
NUMBER를 FLOAT로 강제 변환하는 경우(그 반대도 마찬가지임).
두 유형 모두 타임스탬프인 경우. 다음과 같은 경우에 지원됩니다.
둘 다 동일한 유형을 사용하지만 전체 자릿수가 다를 수 있는 경우.
TIMESTAMP_LTZ를 TIMESTAMP_TZ로 강제 변환하는 경우(그 반대도 마찬가지임).
예:
OBJECT(도시 VARCHAR, 우편번호 NUMBER) 값은 OBJECT(도시 VARCHAR, 우편번호 DOUBLE) 값으로 강제 지정할 수 있습니다.
OBJECT(도시 VARCHAR, 우편번호 NUMBER) 값은 OBJECT(도시 VARCHAR, 우편번호 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 함수를 호출하거나 :: 연산자 를 사용하여 한 정형 값에서 다른 정형 값으로 형 변환할 수 있습니다. 다음과 같은 정형 유형에서 값을 형 변환할 수 있습니다.
정형 ARRAY의 경우:
한 유형의 ARRAY 값을 다른 유형의 ARRAY 값 으로 형 변환할 수 있습니다.
정형 OBJECT의 경우:
캐스트를 사용하여 OBJECT 값에서 키-값 페어의 순서를 변경 할 수 있습니다.
캐스트를 사용하여 OBJECT 값에서 키 이름을 변경 할 수 있습니다.
캐스트를 사용하여 OBJECT 값에 키를 추가 할 수 있습니다.
정형 OBJECT 값을 MAP 값으로 형 변환할 수 있습니다.
MAP 값의 경우:
특정 유형의 키와 값이 있는 MAP 값을 다른 유형의 키와 값이 있는 MAP 값으로 형 변환할 수 있습니다.
MAP 값을 정형 OBJECT 값으로 형 변환할 수 있습니다.
참고
TRY_CAST 는 정형 유형에서 지원되지 않습니다.
한 유형에서 다른 유형으로 값을 형 변환할 수 없는 경우 형 변환이 실패합니다. 예를 들어, ARRAY(BOOLEAN) 값을 ARRAY(DATE) 값으로 형 변환하려고 하면 실패합니다.
예제: ARRAY 값의 한 유형에서 다른 유형으로 형 변환하기¶
다음 예제는 ARRAY(NUMBER) 값을 ARRAY(VARCHAR) 값으로 형 변환합니다.
SELECT CAST(
CAST([1,2,3] AS ARRAY(NUMBER))
AS ARRAY(VARCHAR)) AS cast_array;
+------------+
| CAST_ARRAY |
|------------|
| [ |
| "1", |
| "2", |
| "3" |
| ] |
+------------+
예제: OBJECT 값에서 키-값 페어 순서 변경하기¶
다음 예제는 정형 OBJECT 값의 키-값 페어 순서를 변경하는 예제입니다.
SELECT CAST(
{'city': 'San Mateo','state': 'CA'}::OBJECT(city VARCHAR, state VARCHAR)
AS OBJECT(state VARCHAR, city VARCHAR)) AS object_value_order;
+-----------------------+
| OBJECT_VALUE_ORDER |
|-----------------------|
| { |
| "state": "CA", |
| "city": "San Mateo" |
| } |
+-----------------------+
예제: 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) AS object_value_key_names;
+-----------------------------+
| OBJECT_VALUE_KEY_NAMES |
|-----------------------------|
| { |
| "city_name": "San Mateo", |
| "state_name": "CA" |
| } |
+-----------------------------+
예제: OBJECT 값에 키 추가하기¶
형 변환하려는 유형에 원래 정형 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) AS add_fields;
+------------------------+
| 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);
SELECT OBJECT_CONSTRUCT(
'oname', 'abc',
'created_date', '2020-01-18'::DATE
)::OBJECT(
oname VARCHAR,
created_date DATE
);
자세한 내용은 반정형 유형을 정형 유형으로 명시적으로 캐스팅하기 섹션을 참조하십시오.
참고
정형 ARRAY, 정형 OBJECT 또는 MAP 값은 이러한 함수에 전달할 수 없습니다. 이렇게 하면 정형 타입이 암시적으로 반정형 타입으로 형 변환되는 결과가 발생하며, 이는 값을 암시적으로 캐스팅하기(강제 변환) 에서 설명되는 바와 같이 허용되지 않습니다.
ARRAY 및 OBJECT 상수를 사용하여 정형 ARRAY 및 OBJECT 값 구성하기¶
ARRAY 상수 또는 OBJECT 상수 를 지정하면 반정형 ARRAY 또는 OBJECT 값을 지정하게 됩니다.
정형 ARRAY 또는 OBJECT 값을 구성하려면 식을 명시적으로 형 변환해야 합니다. 예:
SELECT [10, 20, 30]::ARRAY(NUMBER);
SELECT {
'oname': 'abc',
'created_date': '2020-01-18'::DATE
}::OBJECT(
oname VARCHAR,
created_date DATE
);
자세한 내용은 반정형 유형을 정형 유형으로 명시적으로 캐스팅하기 섹션을 참조하십시오.
MAP 값 구성하기¶
MAP 값을 구성하려면 반정형 OBJECT 값을 구성하고 OBJECT 값을 MAP 값으로 형 변환합니다.
예를 들어, 다음 문은 모두 MAP 값 {'city'->'San Mateo','state'->'CA'}
를 생성합니다.
SELECT OBJECT_CONSTRUCT(
'city', 'San Mateo',
'state', 'CA'
)::MAP(
VARCHAR,
VARCHAR
);
SELECT {
'city': 'San Mateo',
'state': 'CA'
}::MAP(
VARCHAR,
VARCHAR
);
다음 문은 MAP 값 {-10->'CA',-20->'OR'}
을 생성합니다.
SELECT {
'-10': 'CA',
'-20': 'OR'
}::MAP(
NUMBER,
VARCHAR
);
자세한 내용은 반정형 OBJECT 및 VARIANT 값을 MAP 값으로 형 변환하기 섹션을 참조하십시오.
정형 유형의 키, 값 및 값의 요소로 작업하기¶
다음 섹션에서는 정형 유형의 값에서 키, 값 및 요소를 사용하는 방법에 대해 설명합니다.
정형 OBJECT 값에서 키 목록 가져오기¶
정형 OBJECT 값의 키 목록을 가져오려면 OBJECT_KEYS 함수를 호출합니다.
SELECT OBJECT_KEYS({'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR, state VARCHAR));
입력이 정형 OBJECT 값인 경우 함수는 키가 포함된 ARRAY(VARCHAR) 값을 반환합니다. 입력이 반정형 OBJECT 값인 경우 함수는 ARRAY 값을 반환합니다.
MAP 값에서 키 목록 가져오기¶
MAP 값의 키 목록을 가져오려면 MAP_KEYS 함수를 호출합니다.
SELECT MAP_KEYS({'my_key':'my_value'}::MAP(VARCHAR,VARCHAR));
정형 유형의 값에서 값 및 요소에 액세스하기¶
다음 방법을 사용하여 정형 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;
+-------------------------------+-----------------------------+
| SEMI_STRUCTURED_ARRAY_ELEMENT | STRUCTURED_ARRAY_ELEMENT |
|-------------------------------+-----------------------------|
| VARIANT[LOB] | VARCHAR(16777216)[LOB] |
+-------------------------------+-----------------------------+
다음 사항을 참고하십시오.
정형 OBJECT 값을 GET 또는 GET_IGNORE_CASE 함수에 전달할 때는 키에 상수를 지정해야 합니다.
MAP 또는 정형 ARRAY 값을 GET 함수에 전달하는 경우 상수를 지정할 필요가 없습니다.
GET_IGNORE_CASE 함수에 MAP 값을 전달하는 경우 상수를 지정할 필요도 없습니다.
정형 OBJECT, 정형 ARRAY 또는 MAP 값을 GET_PATH 함수에 전달할 때는 경로 이름에 상수를 지정해야 합니다.
정형 OBJECT 값의 경우 OBJECT 키 또는 존재하지 않는 경로를 사용하면 컴파일 타임 오류가 발생합니다.
반대로 반정형 OBJECT 값으로 존재하지 않는 인덱스, 키 또는 경로를 사용하는 경우 함수는 NULL 을 반환합니다.
정형 ARRAY 값의 크기 결정하기¶
정형 ARRAY 값의 크기를 확인하려면 ARRAY 값을 ARRAY_SIZE 함수에 전달합니다.
SELECT ARRAY_SIZE([1,2,3]::ARRAY(NUMBER));
MAP 값의 크기 결정하기¶
MAP 값의 크기를 확인하려면 MAP 값을 MAP_SIZE 함수에 전달합니다.
SELECT MAP_SIZE({'my_key':'my_value'}::MAP(VARCHAR,VARCHAR));
정형 ARRAY 값에서 요소 조회하기¶
정형 ARRAY 값에 요소가 있는지 확인하려면 ARRAY_CONTAINS 함수를 호출합니다. 예:
SELECT ARRAY_CONTAINS(10, [1, 10, 100]::ARRAY(NUMBER));
정형 ARRAY 값에서 요소의 위치를 확인하려면 ARRAY_POSITION 함수를 호출합니다. 예:
SELECT ARRAY_POSITION(10, [1, 10, 100]::ARRAY(NUMBER));
MAP 값에 키가 포함되어 있는지 확인하기¶
MAP 값에 키가 포함되어 있는지 확인하려면 MAP_CONTAINS_KEY 함수를 호출합니다.
예:
SELECT MAP_CONTAINS_KEY('key_to_find', my_map);
SELECT MAP_CONTAINS_KEY(10, my_map);
값 비교¶
다음 섹션에서는 값을 비교하는 방법을 설명합니다.
정형 값과 반정형 값 비교하기¶
정형 ARRAY, 정형 OBJECT 또는 MAP 값과 반정형 ARRAY, OBJECT 또는 VARIANT 값을 비교할 수 없습니다.
정형 값과 다른 정형 값 비교하기¶
동일한 유형의 두 값(예: 정형 ARRAY 값 2개, 정형 OBJECT 값 2개 또는 MAP 값 2개)을 비교할 수 있습니다.
현재 정형 타입의 값을 비교하는 데 지원되는 비교 연산자는 다음과 같습니다.
=
!=
<
<=
>=
>
두 정형 값이 같은지 비교할 때는 다음 사항에 유의하십시오.
한 유형을 다른 유형으로 강제 현 변환 할 수 없는 경우 비교가 실패합니다.
숫자 키가 있는 MAP 값을 비교할 때 키는 (VARCHAR 값이 아니라) 숫자로 비교됩니다.
<
, <=
, >=
또는 >
를 사용하여 두 정형 값을 비교하는 경우 정형 값 필드는 알파벳 순서로 비교됩니다. 예를 들어, 다음과 같은 값입니다.
{'a':2,'b':1}::OBJECT(b INTEGER,a INTEGER)
다음 오브젝트보다 큽니다.
{'a':1,'b':2}::OBJECT(b INTEGER,a INTEGER)
두 ARRAY 값의 중첩 여부 확인하기¶
정형 ARRAY 값 2개로 구성된 요소가 중첩되는지 확인해야 하는 경우 ARRAYS_OVERLAP 함수를 호출하십시오. 예:
SELECT ARRAYS_OVERLAP(numeric_array, other_numeric_array);
ARRAY 값은 비교 가능한 유형 이어야 합니다.
이 함수에는 반정형 ARRAY 값과 정형 ARRAY 값을 전달할 수 없습니다. ARRAY 값은 모두 정형 또는 반정형이어야 합니다.
정형 유형의 값 변환하기¶
다음 섹션에서는 정형 ARRAY, 정형 OBJECT 및 MAP 값을 변환하는 방법을 설명합니다.
정형 ARRAY 값 변환하기¶
이러한 함수에 정형 ARRAY 값을 전달하면 함수는 동일한 유형의 정형 ARRAY 값을 반환합니다.
다음 섹션에서는 이러한 함수가 정형 ARRAY 값으로 어떻게 작동하는지 설명합니다.
ARRAY 값에 요소를 추가하는 함수¶
다음 함수는 ARRAY 값에 요소를 추가합니다.
이러한 함수의 경우 요소 유형은 ARRAY 값 유형으로 강제 변환 가능 해야 합니다.
예를 들어, 다음 호출은 NUMBER 값을 DOUBLE 값(ARRAY 값의 유형)으로 강제 지정할 수 있으므로 성공합니다.
SELECT ARRAY_APPEND( [1,2]::ARRAY(DOUBLE), 3::NUMBER );
VARCHAR 값을 DOUBLE 값으로 강제 지정할 수 있으므로 다음 호출이 성공합니다.
SELECT ARRAY_APPEND( [1,2]::ARRAY(DOUBLE), '3' );
DATE 값을 NUMBER 값으로 강제 지정할 수 없기 때문에 다음 호출은 실패합니다.
SELECT ARRAY_APPEND( [1,2]::ARRAY(NUMBER), '2022-02-02'::DATE );
여러 ARRAY 값을 입력으로 허용하는 함수¶
다음 함수는 여러 ARRAY 값을 입력 인자로 사용할 수 있습니다.
이러한 함수를 호출할 때 두 인자는 모두 정형 ARRAY 값 또는 반정형 ARRAY 값이어야 합니다. 예를 들어, 다음 호출은 한 인자가 정형 ARRAY 값이고 다른 인자가 반정형 ARRAY 값이기 때문에 실패합니다.
SELECT ARRAY_CAT( [1,2]::ARRAY(NUMBER), ['3','4'] );
SELECT ARRAY_CAT( [1,2], ['3','4']::ARRAY(VARCHAR) );
ARRAY_EXCEPT 함수는 첫 번째 인자의 ARRAY 값과 같은 유형의 ARRAY 값을 반환합니다.
ARRAY_CAT 및 ARRAY_INTERSECTION 함수는 두 입력 값의 유형을 모두 수용할 수 있는 유형의 ARRAY 값을 반환합니다.
예를 들어, 다음 ARRAY_CAT 호출은 두 개의 정형 ARRAY 값을 전달합니다.
첫 번째 정형 ARRAY 값은 NULLs 을 허용하지 않으며 소수 자릿수가 0인 NUMBER 값(NUMBER(38, 0))을 포함합니다.
두 번째로 정형 ARRAY 값에는 NULL 및 NUMBER 값이 포함되며, 이 값의 소수 자릿수은 1입니다.
ARRAY_CAT 에서 반환된 ARRAY 값은 NULLs 을 허용하며 배율이 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);
+--------------------+-----------------------------------+
| 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) );
ARRAY(NUMBER) 값은 ARRAY(VARCHAR) 값과 비교할 수 없기 때문에 다음 호출이 실패합니다.
SELECT ARRAY_EXCEPT( [1,2]::ARRAY(NUMBER), ['2','3']::ARRAY(VARCHAR) );
정형 OBJECT 값 변환하기¶
다음 섹션에서는 다른 OBJECT 값에서 변환된 정형 OBJECT 값을 반환하는 방법에 대해 설명합니다.
키-값 페어 순서를 변경하거나 키 이름을 바꾸거나 값을 지정하지 않고 키를 추가하려면 CAST 함수 또는 :: 연산자 를 사용합니다. 자세한 내용은 한 정형 유형에서 다른 정형 유형으로 캐스팅하기 섹션을 참조하십시오.
키-값 페어 제거하기¶
특정 키-값 페어가 제거된 기존 OBJECT 값에서 해당 키-값 페어가 포함된 새 OBJECT 값을 반환하려면 OBJECT_DELETE 함수를 호출합니다.
이 함수를 호출할 때 다음 사항에 유의하십시오.
키인 인자의 경우 상수를 지정해야 합니다.
지정한 키가 OBJECT 유형 정의에 포함되지 않으면 호출이 실패합니다. 예를 들어, OBJECT 값에 지정된 키
zip_code
가 포함되어 있지 않으므로 다음 호출은 실패합니다.SELECT OBJECT_DELETE( {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR), 'zip_code' );
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$TYPEOF(new_object);
이 함수는
city
키가 포함되지 않은OBJECT(state VARCHAR)
유형의 OBJECT 값을 반환합니다.+-----------------+--------------------------------------+ | NEW_OBJECT | SYSTEM$TYPEOF(NEW_OBJECT) | |-----------------+--------------------------------------| | { | OBJECT(state VARCHAR(16777216))[LOB] | | "state": "CA" | | | } | | +-----------------+--------------------------------------+
함수가 OBJECT 값에서 모든 키를 제거하면 함수는
OBJECT()
유형의 빈 정형 OBJECT 값을 반환합니다.SELECT OBJECT_DELETE( {'state':'CA'}::OBJECT(state VARCHAR), 'state' ) AS new_object, SYSTEM$TYPEOF(new_object);
+------------+---------------------------+ | NEW_OBJECT | SYSTEM$TYPEOF(NEW_OBJECT) | |------------+---------------------------| | {} | OBJECT()[LOB] | +------------+---------------------------+
정형 OBJECT 값의 유형에 키-값 페어가 포함된 경우 해당 페어의 이름과 유형이 유형 괄호 안에 포함됩니다(예: OBJECT(도시 VARCHAR)). 빈 정형 OBJECT 값에는 키-값 페어가 포함되어 있지 않으므로 괄호는 비어 있습니다.
키-값 페어 삽입 및 값 업데이트하기¶
기존 OBJECT 값에서 키-값 페어 또는 키의 새 값을 추가하여 키-값 페어를 포함하는 새 OBJECT 값을 반환하려면 OBJECT_INSERT 함수를 호출합니다.
이 함수를 호출할 때 다음 사항에 유의하십시오.
키인 인자의 경우 상수를 지정해야 합니다.
updateFlag
인자가 FALSE인 경우(새 키-값 페어를 삽입하는 경우):OBJECT 값에 이미 존재하는 키를 지정하면 오류가 발생합니다.
SELECT OBJECT_INSERT( {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR), 'city', 'San Jose', false );
093202 (23001): Function OBJECT_INSERT: expected structured object to not contain field city but it did.
이 함수는 정형 OBJECT 값을 반환합니다. OBJECT 값의 유형에는 새로 삽입된 키가 포함됩니다. 예를 들어, FLOAT 값
94402
를 사용하여zipcode
키를 추가한다고 가정해 보겠습니다.SELECT OBJECT_INSERT( {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR), 'zip_code', 94402::FLOAT, false ) AS new_object, SYSTEM$TYPEOF(new_object) AS type;
+-------------------------------------+---------------------------------------------------------------------------------------+ | NEW_OBJECT | TYPE | |-------------------------------------+---------------------------------------------------------------------------------------| | { | 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
의 값은 FLOAT에 캐스팅된 값이므로zipcode
의 유형은 FLOAT입니다.
updateFlag
인자가 TRUE인 경우(기존 키-값 페어를 바꾸는 경우):OBJECT 값에 존재하지 않는 키를 지정하면 오류가 발생합니다.
이 함수는 동일한 유형의 정형 OBJECT 값을 반환합니다.
삽입된 값의 유형은 기존 키 유형으로 강제 변환됩니다.
기존 OBJECT에서 키-값 페어 선택하기¶
기존 OBJECT 값에서 선택한 키-값 페어를 포함하는 새 OBJECT 값을 반환하려면 OBJECT_PICK 함수를 호출합니다.
이 함수를 호출할 때 다음 사항에 유의하십시오.
키인 인자의 경우 상수를 지정해야 합니다.
두 번째 인자로 ARRAY 키는 전달할 수 없습니다. 각 키를 별도의 인자로 지정해야 합니다.
이 함수는 정형 OBJECT 값을 반환합니다. OBJECT 값의 유형에는 지정된 순서대로 키가 포함됩니다.
예를 들어,
state
및city
키를 순서대로 선택한다고 가정해 보겠습니다.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);
이 함수는
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)));
+-------+----------------------+ | 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)));
+--------+------------------------+----------+------------------------+ | KEY | SYSTEM$TYPEOF(KEY) | VALUE | SYSTEM$TYPEOF(VALUE) | |--------+------------------------+----------+------------------------| | my_key | VARCHAR(16777216)[LOB] | my_value | VARCHAR(16777216)[LOB] | +--------+------------------------+----------+------------------------+
그렇지 않으면
key
및value
열의 유형은 VARIANT입니다.
MAP 값의 경우 반환되는 키와 값의 순서는 결정되지 않습니다.
PARSE_JSON 함수 사용하기¶
PARSE_JSON 함수는 정형 유형을 반환하지 않습니다.
집합 연산자 및 CASE 식과 함께 정형 유형 사용하기¶
정형 ARRAY, 정형 OBJECT, MAP 값을 사용할 수 있습니다.
집합 연산자의 경우, 서로 다른 식에서 서로 다른 유형이 사용되는 경우(예: 한 유형이 ARRAY(NUMBER)이고 다른 유형이 ARRAY(DOUBLE)인 경우) 한 유형이 다른 유형으로 강제 변환됩니다.
다른 반정형 함수 사용하기¶
다음 함수는 정형 ARRAY, 정형 OBJECT 또는 MAP 값을 입력 인자로 받지 않습니다.
정형 유형 값을 입력으로 전달하면 오류가 발생합니다.
드라이버를 사용하여 애플리케이션에서 정형 유형에 액세스하기¶
드라이버를 사용하는 애플리케이션(예: ODBC 또는 JDBC 드라이버, Python용 Snowflake Connector 등)에서 정형 타입 값은 반정형 타입 값으로 반환됩니다. 예:
정형 ARRAY 열의 값은 클라이언트 애플리케이션에 반정형 ARRAY 값으로 반환됩니다.
정형 OBJECT 또는 MAP 열의 값은 클라이언트 애플리케이션에 반정형 OBJECT 값으로 반환됩니다.
참고
JDBC 드라이버를 사용하는 클라이언트 애플리케이션의 경우 검색하려는 쿼리 결과에 NULL 값이 포함된 정형 ARRAY 값이 포함된 경우 ResultSet.getArray()
메서드는 오류를 반환합니다.
대신 문자열 표현을 검색하려면 ResultSet.getString()
메서드를 사용합니다.
String result = resultSet.getString(1);
사용자 정의 함수(UDF) 및 저장 프로시저와 함께 정형 유형 사용하기¶
SQL, Snowflake Scripting, Java, Python 또는 Scala 에서 사용자 정의 함수(UDF), 사용자 정의 테이블 함수(UDTF) 또는 저장 프로시저를 생성할 때 인자와 반환 값에 정형 유형을 사용할 수 있습니다. 예:
CREATE OR REPLACE FUNCTION my_udf(
location OBJECT(city VARCHAR, zipcode NUMBER, val ARRAY(BOOLEAN)))
RETURNS VARCHAR
AS
$$
...
$$;
CREATE OR REPLACE FUNCTION my_udtf(check BOOLEAN)
RETURNS TABLE(col1 ARRAY(VARCHAR))
AS
$$
...
$$;
CREATE OR REPLACE PROCEDURE my_procedure(values ARRAY(INTEGER))
RETURNS ARRAY(INTEGER)
LANGUAGE SQL
AS
$$
...
$$;
CREATE OR REPLACE FUNCTION my_function(values ARRAY(INTEGER))
RETURNS ARRAY(INTEGER)
LANGUAGE PYTHON
RUNTIME_VERSION=3.10
AS
$$
...
$$;
참고
정형 타입은 아직 JavaScript 의 UDFs, UDTFs 및 저장 프로시저에서 지원되지 않습니다.
정형 유형에 대한 정보 보기¶
다음 섹션에서는 정형 유형에 대한 정보를 보는 데 사용할 수 있는 뷰와 명령에 대해 설명합니다.
SHOW COLUMNS 명령을 사용하여 정형 유형 정보 보기¶
SHOW COLUMNS 명령의 출력에서 data_type
열에는 요소, 키, 값의 유형에 대한 정보가 포함됩니다.
DESCRIBE 및 기타 SHOW 명령을 사용하여 정형 유형 정보 보기¶
다음 명령의 출력에는 정형 유형에 대한 정보가 포함됩니다.
예를 들어, DESCRIBE RESULT 출력에서 MAP(VARCHAR, VARCHAR) 열의 행에는 type
열에 다음 값이 포함됩니다.
map(VARCHAR(16777216), VARCHAR(16777216))
ARRAY(NUMBER) 열의 행에는 type
열에 다음 값이 포함됩니다.
ARRAY(NUMBER(38,0))
데이터베이스에 사용된 정형 유형에 대한 정보 보기¶
정형 유형 열의 경우 INFORMATION_SCHEMA COLUMNS 뷰 는 열의 기본 데이터 타입(ARRAY, OBJECT 또는 MAP)에 대한 정보만 제공합니다.
예를 들어, data_type
열에는 “ARRAY
”, “OBJECT
” 또는 “MAP
”만 포함됩니다. 열에는 요소, 키 또는 값의 유형이 포함되지 않습니다.
요소, 키, 값의 유형에 대한 정보를 보려면 다음 뷰를 사용하십시오.
정형 ARRAY 타입의 요소 유형에 대한 자세한 내용을 보려면 INFORMATION_SCHEMA 의 ELEMENT_TYPES 뷰 또는 ACCOUNT_USAGE 의 ELEMENT_TYPES 뷰 를 쿼리하십시오.
정형 OBJECT 및 MAP 값의 키 및 값 유형에 대한 자세한 내용을 보려면 INFORMATION_SCHEMA 의 FIELDS 뷰 또는 ACCOUNT_USAGE 의 FIELDS 뷰 를 쿼리하십시오.