SnowConvert: Teradata 기본 제공 함수¶
참고
이 페이지에는 SnowConvert 에 의해 이미 변환된 함수만 목록이 표시되며, Teradata 설명서의 함수가 여기에 나열되지 않은 경우 지원되지 않는 것으로 간주해야 합니다.
참고
일부 Teradata 함수는 Snowflake에 직접 대응하는 함수가 없기 때문에 기능적으로 대응하는 UDF 로 변환되며, 함수 이름 _UDF 접두사가 붙으면 쉽게 알아볼 수 있습니다. UDFs SnowConvert 사용에 대한 자세한 내용은 이 git 리포지토리 에서 확인할 수 있습니다.
집계 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
AVG |
AVG |
|
CORR |
CORR |
|
COUNT |
COUNT |
|
COVAR_POP |
COVAR_POP |
|
COVAR_SAMP |
COVAR_SAMP |
|
GROUPING |
GROUPING |
|
KURTOSIS |
KURTOSIS |
|
MAXIMUM MAX |
MAX |
|
MINIMUM MIN |
MIN |
|
PIVOT |
PIVOT |
PIVOT. 확인 |
REGR_AVGX |
REGR_AVGX |
|
REGR_AVGY |
REGR_AVGY |
|
REGR_COUNT |
REGR_COUNT |
|
REGR_INTERCEPT |
REGR_INTERCEPT |
|
REGR_R2 |
REGR_R2 |
|
REGR_SLOPE |
REGR_SLOPE |
|
REGR_SXX |
REGR_SXX |
|
REGR_SXY |
REGR_SXY |
|
REGR_SYY |
REGR_SYY |
|
SKEW |
SKEW |
|
STDDEV_POP |
STDDEV_POP |
|
STDDEV_SAMP |
STDDEV_SAMP |
|
SUM |
SUM |
|
UNPIVOT |
UNPIVOT |
<p>여러 함수가 있는 피벗 해제는<br>Snowflake에서 지원되지 않습니다</p> |
VAR_POP |
VAR_POP |
|
VAR_SAMP |
VAR_SAMP |
집계 함수 참조
산술, 삼각, 쌍곡선 연산자/함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
ABS |
ABS |
|
CEILING |
CEIL |
|
DEGREES |
DEGREES |
|
EXP |
EXP |
|
FLOOR |
FLOOR |
|
HYPERBOLIC ACOSH ASINH ATANH COSH SINH TANH |
HYPERBOLIC ACOSH ASINH ATANH COSH SINH TANH |
|
LOG |
LOG |
|
LN |
LN |
|
MOD |
MOD |
|
NULLIFZERO(param) |
CASE WHEN param=0 THEN null ELSE param END |
|
POWER |
POWER |
|
RANDOM |
RANDOM |
|
RADIANS |
RADIANS |
|
ROUND |
ROUND |
|
SIGN |
SIGN |
|
SQRT |
SQRT |
|
TRUNC |
TRUNC_UDF |
|
TRIGONOMETRIC ACOS ASIN ATAN ATAN2 COS SIN TAN |
TRIGONOMETRIC ACOS ASIN ATAN ATAN2 COS SIN TAN |
|
ZEROIFNULL |
ZEROIFNULL |
특성 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
BIT_LENGTH |
BIT_LENGTH |
|
BYTE BYTES |
LENGTH |
|
CHAR CHARS CHARACTERS |
LEN |
|
CHAR_LENGTH CHARACTER_LENGTH |
LEN |
|
MCHARACTERS |
LENGTH |
|
OCTECT_LENGTH |
OCTECT_LENGTH |
특성 함수 참조
비트/바이트 조작 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
BITAND |
BITAND |
|
BITNOT |
BITNOT |
|
BITOR |
BITOR |
|
BITXOR |
BITXOR |
|
GETBIT |
GETBIT |
비트/바이트 함수 참조
기본 제공(시스템 함수)¶
Teradata |
Snowflake |
참고 |
---|---|---|
ACCOUNT |
CURRENT_ACCOUNT |
|
CURRENT_DATE CURDATE |
CURRENT_DATE |
|
CURRENT_ROLE |
CURRENT_ROLE |
|
CURRENT_TIME |
CURRENT_TIME |
|
CURRENT_TIMESTAMP |
CURRENT_TIMESTAMP |
|
DATABASE |
CURRENT_DATABASE |
|
DATE |
CURRENT_DATE |
|
NOW |
CURRENT_TIMESTAMP |
|
PROFILE |
CURRENT_ROLE |
|
SESSION |
CURRENT_SESSION |
|
TIME |
CURRENT_TIME |
|
USER |
CURRENT_USER |
기본 제공 함수 참조
비즈니스 캘린더¶
Teradata |
Snowflake |
참고 |
---|---|---|
DAYNUMBER_OF_MONTH(DatetimeValue, ‘COMPATIBLE’) |
DAYOFMONTH |
|
DAYNUMBER_OF_MONTH(DatetimeValue, ‘ISO’) |
DAYNUMBER_OF_MONTH_ISO_UDF |
|
DAYNUMBER_OF_MONTH(DatetimeValue, ‘TERADATA’) |
DAYOFMONTH |
|
DAYNUMBER_OF_WEEK(DatetimeValue, ‘ISO’) |
DAYOFWEEKISO |
|
DAYNUMBER_OF_WEEK(DatetimeValue, ‘COMPATIBLE’) |
DAY_OF_WEEK_COMPATIBLE_UDF |
|
DAYNUMBER_OF_WEEK(DatetimeValue, ‘TERADATA’) |
TD_DAY_OF_WEEK_UDF |
|
DAYNUMBER_OF_YEAR(DatetimeValue, ‘ISO’) |
PUBLIC.DAY_OF_YEAR_ISO_UDF |
|
DAYNUMBER_OF_YEAR(DatetimeValue) |
DAYOFYEAR |
|
QUARTERNUMBER_OF_YEAR |
QUARTER |
|
TD_SUNDAY(DateTimeValue) |
PREVIOUS_DAY(DateTimeValue, ‘Sunday’) |
|
WEEKNUMBER_OF_MONTH |
WEEKNUMBER_OF_MONTH_UDF |
|
WEEKNUMBER_OF_QUARTER(dateTimeValue) |
WEEKNUMBER_OF_QUARTER_UDF |
|
WEEKNUMBER_OF_QUARTER(dateTimeValue, ‘ISO’) |
WEEKNUMBER_OF_QUARTER_ISO_UDF |
|
WEEKNUMBER_OF_QUARTER(dateTimeValue, ‘COMPATIBLE’) |
WEEKNUMBER_OF_QUARTER_COMPATIBLE_UDF |
|
WEEKNUMBER_OF_YEAR(DateTimeValue, ‘ISO’) |
WEEKISO |
|
YEARNUMBER_OF_CALENDAR(DATETIMEVALUE, ‘COMPATIBLE’) |
YEAR |
|
YEARNUMBER_OF_CALENDAR(DATETIMEVALUE, ‘ISO’) |
YEAROFWEEKISO |
비즈니스 캘린더 참조
캘린더 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
DAYNUMBER_OF_WEEK(DatetimeValue) |
TD_DAY_OF_WEEK_UDF |
|
DAYNUMBER_OF_WEEK(DatetimeValue, ‘COMPATIBLE’) |
DAY_OF_WEEK_COMPATIBLE_UDF |
|
QuarterNumber_Of_Year(DatetimeValue, ‘ISO’) |
QUARTER_OF_YEAR_ISO_UDF(DatetimeValue) |
|
TD_DAY_OF_CALENDAR |
TD_DAY_OF_CALENDAR_UDF |
|
TD_DAY_OF_MONTH |
DAYOFMONTH |
|
TD_DAY_OF_WEEK |
TD_DAY_OF_WEEK_UDF |
|
TD_DAY_OF_YEAR |
DAYOFYEAR |
|
TD_MONTH_OF_CALENDAR(DateTimeValue) |
TD_MONTH_OF_CALENDAR_UDF(DateTimeValue) |
|
TD_WEEK_OF_CALENDAR(DateTimeValue) |
TD_WEEK_OF_CALENDAR_UDF(DateTimeValue) |
|
TD_WEEK_OF_YEAR |
WEEK_OF_YEAR_UDF |
|
TD_YEAR_BEGIN(DateTimeValue) |
YEAR_BEGIN_UDF(DateTimeValue) |
|
TD_YEAR_BEGIN(DateTimeValue, ‘ISO’) |
YEAR_BEGIN_ISO_UDF(DateTimeValue) |
|
TD_YEAR_END(DateTimeValue) |
YEAR_END_UDF(DateTimeValue) |
|
TD_YEAR_END(DateTimeValue, ‘ISO’) |
YEAR_END_ISO_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_MONTH(DateTimeValue) |
WEEKNUMBER_OF_MONTH_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_QUARTER(DateTimeValue) |
WEEKNUMBER_OF_QUARTER_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_QUARTER(DateTimeValue, ‘ISO’) |
WEEKNUMBER_OF_QUARTER_ISO_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_QUARTER(DateTimeValue, ‘COMPATIBLE’) |
WEEKNUMBER_OF_QUARTER_COMPATIBLE_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_YEAR(DateTimeValue) |
WEEK_OF_YEAR_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_YEAR(DateTimeValue, ‘COMPATIBLE’) |
WEEK_OF_YEAR_COMPATIBLE_UDF(DateTimeValue) |
캘린더 함수 참조
대/소문자 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
COALESCE |
COALESCE |
Coalesce 확인 |
NULLIF |
NULLIF |
대/소문자 함수 참조
비교 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
DECODE |
DECODE |
|
GREATEST |
GREATEST |
|
LEAST |
LEAST |
비교 함수 참조
데이터 타입 변환¶
Teradata |
Snowflake |
참고 |
---|---|---|
CAST |
CAST |
|
CAST(DatetimeValue AS INT) |
DATE_TO_INT_UDF |
|
CAST (VarcharValue AS INTERVAL) |
INTERVAL_UDF |
|
TRYCAST |
TRY_CAST |
|
FROM_BYTES |
TO_NUMBER |
ASCII 매개 변수가 있는 FROM_BYTES는 Snowflake에서 지원되지 않습니다. |
데이터 타입 변환 참조
데이터 타입 변환 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
TO_BYTES(Input, ‘Base10’) |
INT2HEX_UDF(Input) |
|
TO_NUMBER |
TO_NUMBER |
|
TO_CHAR |
TO_CHAR 또는 이와 동등한 식 |
TO_CHAR를 확인하십시오. |
TO_DATE |
TO_DATE |
|
TO_DATE(input, ‘YYYYDDD’) |
JULIAN_TO_DATE_UDF |
데이터 타입 변환 함수 참조
DateTime 및 간격 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
ADD_MONTHS |
ADD_MONTHS |
|
EXTRACT |
EXTRACT |
|
LAST_DAY |
LAST_DAY |
|
MONTH |
MONTH |
|
MONTHS_BETWEEN |
MONTHS_BETWEEN_UDF |
|
NEXT_DAY |
NEXT_DAY |
|
OADD_MONTHS |
ADD_MONTHS |
|
ROUND(숫자) |
ROUND |
|
ROUND(날짜) |
ROUND_DATE_UDF |
|
TRUNC(날짜) |
TRUNC_UDF |
|
YEAR |
YEAR |
해시 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
HASH_MD5 |
MD5 |
|
HASHAMP HASHBACKAM HASHBUCKET HASHROW |
지원되지 않음 |
Teradata와 Snowflake의 아키텍처 차이점에 대한 메모를 확인하십시오. |
해시 함수 참조
JSON 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
NEW JSON |
TO_JSON(PARSE_JSON() ) |
NEW JSON 확인 |
JSON_CHECK |
CHECK_JSON |
JSON_CHECK 확인 |
JSON_TABLE |
동등한 쿼리 |
JSON_TABLE 확인 |
JSONExtract JSONExtractValue |
JSON_EXTRACT_UDF |
JSON_EXTRACT 확인 |
JSON 설명서 를 참조하십시오.
Null 처리 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
NVL |
NVL |
|
NVL2 |
NVL2 |
Null 처리 함수 참조
정렬된 분석/윈도우 집계 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
CSUM(col1, col2) |
SUM(col_1) OVER (PARTITION BY null ORDER BY col_2 ROWS UNBOUNDED PRECEDING) |
|
CUME_DIST |
CUME_DIST |
|
DENSE_RANK |
DENSE_RANK |
|
FIRST_VALUE |
FIRST_VALUE |
|
LAG |
LAG |
|
LAST_VALUE |
LAST_VALUE |
|
LEAD |
LEAD |
|
MAVG(csales, 2, cdate, csales) |
AVG(csales) OVER ( ORDER BY cdate, csales ROWS 1 PRECEDING) |
|
MEDIAN |
MEDIAN |
|
MSUM(csales, 2, cdate, csales) |
SUM(csales) OVER(ORDER BY cdate, csales ROWS 1 PRECEDING) |
|
PERCENT_RANK |
PERCENT_RANK |
|
PERCENTILE_CONT |
PERCENTILE_CONT |
|
PERCENTILE_DISC |
PERCENTILE_DISC |
|
QUANTILE |
QUANTILE |
|
RANK |
RANK |
|
ROW_NUMBER |
ROW_NUMBER |
윈도우 함수 참조
기간 함수 및 연산자¶
Teradata |
Snowflake |
참고 |
---|---|---|
BEGIN |
PERIOD_BEGIN_UDF |
|
END |
PERIOD_END_UDF |
|
INTERVAL |
TIMESTAMPDIFF |
|
LAST |
PERIOD_LAST_UDF |
|
LDIFF |
PERIOD_LDIFF_UDF |
|
OVERLAPS |
PUBLIC.PERIOD_OVERLAPS_UDF |
|
PERIOD |
PERIOD_UDF |
|
PERIOD(datetimeValue, UNTIL_CHANGED) |
PERIOD_UDF(datetimeValue, ‘9999-12-31 23:59:59.999999’) |
끝 바인딩 상수에 대한 참고 사항 참조 |
RDIFF |
PERIOD_RDIFF_UDF |
기간 함수 및 연산자 참조
쿼리 밴드 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
GETQUERYBANDVALUE |
GETQUERYBANDVALUE_UDF |
GETQUERYBANDVALUE 확인 |
쿼리 밴드 함수 참조
정규식 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
REGEXP_INSTR |
REGEXP_INSTR |
정규식 함수를 확인하십시오 |
REGEXP_REPLACE |
REGEXP_REPLACE |
정규식 함수를 확인하십시오 |
REGEXP_SIMILAR |
REGEXP_LIKE |
정규식 함수를 확인하십시오 |
REGEXP_SUBSTR |
REGEXP_SUBSTR |
정규식 함수를 확인하십시오 |
Regex 함수 참조
문자열 연산자 및 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
ASCII |
ASCII |
|
CHAR2HEXINT |
CHAR2HEXINT_UDF |
|
CHR |
CHR/CHAR |
|
CHAR_LENGTH |
LEN |
|
CONCAT |
CONCAT |
|
EDITDISTANCE |
EDITDISTANCE |
|
INDEX |
CHARINDEX |
암시적 변환에 대한 참고 사항 참조 |
INITCAP |
INITCAP |
|
INSTR |
REGEXP_INSTR |
|
INSTR(StringValue, StringValue ,NumericNegativeValue, NumericValue) |
INSTR_UDF(StringValue, StringValue ,NumericNegativeValue, NumericValue) |
|
LEFT |
LEFT |
|
LENGTH |
LENGTH |
|
LOWER |
LOWER |
|
LPAD |
LPAD |
|
LTRIM |
LTRIM |
|
OREPLACE |
REPLACE |
|
OTRANSLATE |
TRANSLATE |
|
POSITION |
POSITION |
암시적 변환에 대한 참고 사항 참조 |
REVERSE |
REVERSE |
|
RIGHT |
RIGHT |
|
RPAD |
RPAD |
|
RTRIM |
RTRIM |
|
SOUNDEX |
SOUNDEX_P123 |
|
STRTOK |
STRTOK |
|
STRTOK_SPLIT_TO_TABLE |
STRTOK_SPLIT_TO_TABLE |
Check Strtok_split_to_table |
SUBSTRING |
SUBSTR/SUBSTR_UDF |
서브스트링 확인 |
TRANSLATE_CHK |
TRANSLATE_CHK_UDF |
|
TRIM(LEADING ‘0’ FROM aTABLE) |
LTRIM(aTABLE, ‘0’) |
|
TRIM(TRAILING ‘0’ FROM aTABLE) |
RTRIM(aTABLE, ‘0’) |
|
TRIM(BOTH ‘0’ FROM aTABLE) |
TRIM(aTABLE, ‘0’) |
|
TRIM(CAST(numericValue AS FORMAT ‘999’)) |
LPAD(numericValue, 3, 0) |
|
UPPER |
UPPER |
문자열 연산자 및 함수 참조
St_Point 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
ST_SPHERICALDISTANCE |
HAVERSINE |
St_Point 함수 참조
테이블 연산자¶
Teradata |
Snowflake |
참고 |
---|---|---|
TD_UNPIVOT |
동등한 쿼리 |
확인 Td_unpivot |
테이블 연산자 참조
XML 함수¶
Teradata |
Snowflake |
참고 |
---|---|---|
XMLAGG |
LISTAGG |
Xmlagg 확인 |
XMLQUERY |
지원되지 않음 |
XML 함수참조
확장성 UDFs¶
이 섹션에는 UDFs 및 Teradata에서 시스템 기본 제공 함수로 제공되지는 않지만, SnowConvert 에 의해 변환된 기타 확장성 함수가 포함되어 있습니다
Teradata |
Snowflake |
참고 |
---|---|---|
CHKNUM |
CHKNUM_UDF |
UDF 다운로드 페이지 참조 |
참고¶
Teradata와 Snowflake의 아키텍처 차이점¶
Teradata는 액세스 모듈 프로세서(AMP)를 통해 각 AMP 가 디스크 저장소의 고유한 몫을 관리하고 쿼리 수행 시 해시를 통해 액세스하는 공유 아키텍처를 채택하고 있습니다. 병렬성을 활용하려면 저장된 정보가 AMPs 에 고르게 분산되어야 하며, 이를 위해 Teradata는 실제 기본 인덱스가 얼마나 좋은지 결정하는 데 사용할 수 있는 해시 관련 함수 그룹을 제공합니다.
반면, Snowflake 아키텍처는 데이터 저장 방식을 자체적으로 관리하므로 사용자는 데이터 배포 최적화에 대해 걱정할 필요가 없습니다.
끝 바인딩 상수(UNTIL_CHANGED 및 UNTIL_CLOSED)¶
UNTIL_CHANGED 및 UNTIL_CLOSED 는 모두 기간에 바인딩된 정의되지 않은 엔딩을 나타내는 Teradata 상수입니다. 내부적으로 이러한 상수는 타임스탬프가 가질 수 있는 최대값, 즉 ‘9999-12-31 23:59:59.999999’로 표시됩니다. PERIOD 함수를 마이그레이션하는 동안 끝 바인드가 존재하는지 확인하여 이러한 상수 중 하나인지 확인하고, 존재하는 경우 ‘9999-12-31 23:59:59.999999’ 값의 varchar로 대체합니다. 그런 다음 Snowflake는 PERIOD___UDF 를 호출할 때 시작 바인딩의 유형에 따라 varchar를 날짜 또는 타임스탬프로 형 변환합니다.
암시적 변환¶
INDEX 또는 POSITION 같은 일부 Teradata 문자열 함수는 문자열이 아닌 데이터 타입을 허용하고 이를 암시적으로 문자열로 변환하므로, Teradata와 Snowflake 간에 해당 함수의 결과에 불일치가 발생할 수 있습니다. 예를 들어, 다음 Teradata 코드가 있습니다.
SELECT INDEX(35, '5');
4를 반환하고, CHARINDEX 는 Snowflake에 해당합니다.
SELECT CHARINDEX('5', 35);
2를 반환하는 경우, 이는 Teradata에 암시적 변환 중에 사용되는 자체 기본 형식 이 있기 때문에 발생합니다. 위의 예에서 Teradata는 숫자 상수 35를 BYTEINT 로 해석하고 BYTEINT 기본값 형식 '-999'
을 사용하여 문자열로 암시적으로 변환하므로 변환된 값은 '35'
가 됩니다. 반면에 Snowflake는 자체 기본 형식 을 사용하므로 결과에 불일치가 발생합니다.
이 문제를 해결하기 위해 해당 함수 매개 변수를 다음과 같이 변경합니다.
매개 변수에 형식의 형 변환이 없는 경우, 대신 기본 Teradata 형식에 해당하는 Snowflake
TO_VARCHAR
함수가 추가됩니다.매개 변수에 형식을 갖는 형변환이 있는 경우 형식이 해당 형식에 해당하는 Snowflake로 변환되고
TO_VARCHAR
함수가 추가됩니다.참고로, Teradata는 숫자 부호가 형식 안에 명시적으로 입력되지 않은 경우 이를 무시하는 반면, Snowflake는 지정되지 않은 경우에도 항상 공백을 추가하여 부호를 삽입하며, 이러한 경우 부호가 지정되었는지 확인하고 지정되지 않은 경우 Snowflake 문자열에서 부호를 제거하기 위해 검사를 수행합니다.
이러한 변경 후 결과 코드는 다음과 같습니다.
SELECT CHARINDEX( '5', TO_VARCHAR(35, 'MI999'));
그러면 Teradata 코드와 동일한 4가 반환됩니다.
알려진 문제 ¶
문제가 발견되지 않았습니다.
숫자 데이터 타입에서 Varchar 데이터 타입으로 형 변환¶
varchar로 형 변환할 때 Teradata는 각 숫자 데이터 타입에 대해 기본 형식을 사용하므로, Snowconvert는 플랫폼 간에 동등성을 유지하기 위해 형식을 추가합니다.
샘플 소스 패턴¶
BYTEINT¶
Teradata¶
SELECT '"'||cast(cast(12 as BYTEINT) as varchar(10))||'"';
(('"'||12)||'"')|
----------------+
"12" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(cast(12 as BYTEINT), 'TM'), 10) ||'"';
"'""'|| LEFT(TO_VARCHAR(CAST(12 AS BYTEINT), 'TM'), 10) ||'""'"
---------------------------------------------------------------
"12"
SMALLINT¶
Teradata¶
SELECT '"'||cast(cast(123 as SMALLINT) as varchar(10))||'"';
(('"'||123)||'"')|
-----------------+
"123" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'"';
"'""'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"123"
INTEGER¶
Teradata¶
SELECT '"'||cast(cast(12345 as INTEGER) as varchar(10))||'"';
(('"'||12345)||'"')|
-------------------+
"12345" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'"';
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'""'"
------------------------------------------------------------------
"12345"
BIGINT¶
Teradata¶
SELECT '"'||cast(cast(12345 as BIGINT) as varchar(10))||'"';
(('"'||12345)||'"')|
-------------------+
"12345" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'"';
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"12345"
DECIMAL[(n[,m])] 또는 NUMERIC[(n[,m])]¶
Teradata¶
SELECT '"'||cast(cast(12345 as DECIMAL) as varchar(10))||'"',
'"'||cast(cast(12345 as DECIMAL(12, 2)) as varchar(10))||'"';
(('"'||12345)||'"')|(('"'||12345)||'"')|
-------------------+-------------------+
"12345." |"12345.00" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL), 'TM.'), 10) ||'"',
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL(12, 2)), 'TM'), 10) ||'"';
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL), 'TM.'), 10) ||'"' '"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL(12, 2)), 'TM'), 10) ||'"'
"12345." "12345.00"
알려진 문제 ¶
Teradata는 0과 1 사이의 숫자를 Snowflake와 다르게 취급합니다. 이러한 값의 경우 Teradata는 점 앞에 0을 추가하지 않지만, Snowflake는 0을 추가합니다.
Teradata¶
SELECT '"'||cast(cast(-0.1 as DECIMAL(12, 2)) as varchar(10))||'"' AS column1,
'"'||cast(cast(0.1 as DECIMAL(12, 2)) as varchar(10))||'"' AS column2;
COLUMN1 |COLUMN2
-----------------+--------------+
"-.10" |".10" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(-0.1 AS DECIMAL(12, 2)), 'TM'), 10) ||'"' AS column1,
'"'|| LEFT(TO_VARCHAR(CAST(0.1 AS DECIMAL(12, 2)), 'TM'), 10) ||'"' AS column2;
COLUMN1 |COLUMN2
------------------+---------------+
"-0.10" |"0.10" |
관련 EWIs ¶
관련 EWIs 없음.
{ } 을 사용하여 DATE 로 형변환합니다.¶
설명¶
다음 구문은 중괄호 안에 문자열 정의 앞에 d를 넣어 날짜 형식의 문자열을 DATE 데이터 타입으로 형 변환합니다.
SELECT {d '1233-10-10'}
샘플 소스 패턴¶
중괄호를 사용하여 DATE 로 형변환¶
Teradata
SELECT * FROM RESOURCE_DETAILS where change_ts >= {d '2022-09-10'};
Snowflake
SELECT
* FROM
PUBLIC.RESOURCE_DETAILS
where change_ts >= DATE('2022-09-10');
INTERVAL 데이터 타입으로 형변환¶
설명¶
Snowflake는 Interval 데이터 타입을 지원하지 않지만, DateTime 작업에 사용할 수 있는 INTERVAL 상수가 있고, VARCHAR 을 사용하여 다른 용도로 에뮬레이션할 수 있으며, SnowConvert 는 CAST 함수를 경우에 따라 INTERVAL 데이터 타입에 해당하는 항목으로 변환합니다.
형 변환되는 값이 인터벌 타입인 경우 UDF 가 생성되어 새로운 인터벌에 해당하는 문자열을 생성합니다
값이 리터럴인 경우, 날짜/시간 작업에 형변환이 사용되명 Snowflake 간격 상수가 생성되고, 그렇지 않으면 리터럴 문자열이 생성됩니다
값이 리터럴이 아닌 경우 문자열로 형변환이 생성됩니다
샘플 소스 패턴¶
비인터벌 리터럴¶
Teradata¶
SELECT TIMESTAMP '2022-10-15 10:30:00' + CAST ('12:34:56.78' AS INTERVAL HOUR(2) TO SECOND(2)) AS VARCHAR_TO_INTERVAL,
TIMESTAMP '2022-10-15 10:30:00' + CAST(-5 AS INTERVAL YEAR(4)) AS NUMBER_TO_INTERVAL,
CAST('07:00' AS INTERVAL HOUR(2) TO MINUTE) AS OUTSIDE_DATETIME_OPERATION;
VARCHAR_TO_INTERVAL | NUMBER_TO_INTERVAL | OUTSIDE_DATETIME_OPERATION |
--------------------+--------------------+----------------------------+
2022-10-15 23:04:56 |2017-10-15 10:30:00 | 7:00 |
Snowflake¶
SELECT
TIMESTAMP '2022-10-15 10:30:00' + INTERVAL '12 HOUR, 34 MINUTE, 56 SECOND, 780000 MICROSECOND' AS VARCHAR_TO_INTERVAL,
TIMESTAMP '2022-10-15 10:30:00' + INTERVAL '-5 YEAR' AS NUMBER_TO_INTERVAL,
'07:00' AS OUTSIDE_DATETIME_OPERATION;
VARCHAR_TO_INTERVAL | NUMBER_TO_INTERVAL | OUTSIDE_DATETIME_OPERATION |
------------------------+------------------------+----------------------------+
2022-10-15 23:04:56.780 |2017-10-15 10:30:00.000 | 07:00 |
비리터럴 및 비구간 값¶
Teradata¶
SELECT TIMESTAMP '2022-10-15 10:30:00' + CAST('20 ' || '10' AS INTERVAL DAY TO HOUR) AS DATETIME_OPERATION,
CAST('20 ' || '10' AS INTERVAL DAY TO HOUR) AS OUTSIDE_DATETIME_OPERATION;
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-11-04 20:30:00 | 20 10 |
Snowflake¶
SELECT
PUBLIC.DATETIMEINTERVALADD_UDF(TIMESTAMP '2022-10-15 10:30:00', CAST('20 ' || '10' AS VARCHAR(21)), 'DAY', '+') AS DATETIME_OPERATION,
CAST('20 ' || '10' AS VARCHAR(21)) AS OUTSIDE_DATETIME_OPERATION;
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-11-04 20:30:00.000 | 20 10 |
간격을 다른 간격으로 형 변환¶
Teradata¶
SELECT
TIMESTAMP '2022-10-15 10:30:00' + CAST(INTERVAL '5999' MINUTE AS INTERVAL DAY TO HOUR) AS DATETIME_OPERATION,
CAST(INTERVAL '5999' MINUTE AS INTERVAL DAY TO HOUR) AS OUTSIDE_DATETIME_OPERATION;
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-10-19 13:30:00 | 4 03 |
Snowflake¶
SELECT
PUBLIC.DATETIMEINTERVALADD_UDF(
TIMESTAMP '2022-10-15 10:30:00', PUBLIC.INTERVALTOINTERVAL_UDF('5999', 'MINUTE', 'MINUTE', 'DAY', 'HOUR'), 'DAY', '+') AS DATETIME_OPERATION,
PUBLIC.INTERVALTOINTERVAL_UDF('5999', 'MINUTE', 'MINUTE', 'DAY', 'HOUR') AS OUTSIDE_DATETIME_OPERATION;
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-10-19 13:30:00.000 | 4 03 |
Known Issues¶
알려진 문제 없음.
관련 EWIs¶
관련 EWIs 없음.
COALESCE¶
설명¶
Coalesce 함수는 목록에서 null이 아닌 첫 번째 요소를 반환하는 데 사용됩니다. 자세한 내용은 COALESCE 에서 확인할 수 있습니다.
COALESCE(element_1, element_2 [, element_3, ..., element_n])
Teradata 및 Snowflake COALESCE 함수 모두 숫자와 문자열, 날짜와 타임스탬프 매개 변수를 혼합할 수 있습니다. 그러나 이 두 가지 경우를 처리하는 방식은 다릅니다.
문자열 매개 변수와 함께 숫자: Teradata는 모든 숫자 매개 변수를 varchar로 변환하는 반면, Snowflake는 그 반대의 작업을 수행합니다.
날짜 매개 변수와 함께 타임스탬프: Teradata는 모든 타임스탬프를 날짜로 변환하는 반면, Snowflake는 그 반대의 작업을 수행합니다
첫 번째 경우 기능적 동등성을 보장하기 위해 모든 숫자 매개 변수는 to_varchar
함수를 사용하여 문자열
로 형 변환되며, 이는 숫자의 형식을 고려합니다. 두 번째 경우, 모든 타임스탬프는 to_date
를 사용하여 날짜로 형 변환되며, Teradata는 타임스탬프 형 변환 시 타임스탬프 형식을 무시하므로 변환 중에 제거됩니다.
샘플 소스 패턴¶
문자열 매개 변수와 혼합된 숫자¶
Teradata¶
SELECT COALESCE(125, 'hello', cast(850 as format '-999'));
COLUMN1|
-------+
125 |
Snowflake¶
SELECT
COALESCE(TO_VARCHAR(125), 'hello', TO_VARCHAR(850, '9000'));
COLUMN1|
-------+
125 |
날짜 매개 변수와 혼합된 타임스탬프¶
Teradata¶
SELECT COALESCE(cast(TIMESTAMP '2021-09-14 10:14:59' as format 'HH:MI:SSBDD-MM-YYYY'), current_date);
COLUMN1 |
-----------+
2021-09-14 |
Snowflake¶
SELECT
COALESCE(TO_DATE(TIMESTAMP '2021-09-14 10:14:59' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'HH:MI:SSBDD-MM-YYYY' NOT SUPPORTED. ***/!!!), CURRENT_DATE());
COLUMN1 |
-----------+
2021-09-14 |
Known Issues¶
알려진 문제 없음_._
관련 EWIs¶
SSC-EWI-TD0025: 지원되지 않는 출력 형식입니다.
CURRENT_TIMESTAMP¶
심각도¶
낮음
설명¶
분수 초는 TIME_OUTPUT_FORMAT 세션 매개 변수에서 명시적으로 설정된 경우에만 표시됩니다.
입력 코드:¶
SELECT current_timestamp(4) at local;
출력 코드:¶
SELECT
current_timestamp(4);
권장 사항¶
TIME_OUTPUT___FORMAT 세션 매개 변수가 원하는 동작을 얻도록 설정되어 있는지 확인합니다.
추가 지원이 필요한 경우 snowconvert-support@Snowflake.com으로 이메일을 보내주십시오.
알려진 문제 ¶
문제가 발견되지 않았습니다.
관련 EWIs ¶
관련 EWIs 없음.
DAYNUMBER_OF_MONTH¶
설명¶
월 초부터 지정된 날짜까지 경과한 일수를 반환합니다. 자세한 내용은 DAYNUMBER_OF_MONTH 에서 확인할 수 있습니다.
DAYNUMBER_OF_MONTH(expression [, calendar_name])
Teradata와 Snowflake는 한 가지 예외를 제외하고 DAYNUMBER_OF_MONTH 함수를 동일한 방식으로 처리합니다.
ISO 달력: ISO 의 달은 4주 또는 5주로 구성됩니다. 자세한 내용은 ISO 계산 정보 에서 확인할 수 있습니다.
기능적 동등성을 보장하기 위해 ISO 달력 케이스에 사용자 정의 함수(UDF)가 추가되었습니다.
샘플 소스 패턴¶
Teradata¶
SELECT
DAYNUMBER_OF_MONTH (DATE'2022-12-22'),
DAYNUMBER_OF_MONTH (DATE'2022-12-22', NULL),
DAYNUMBER_OF_MONTH (DATE'2022-12-22', 'Teradata'),
DAYNUMBER_OF_MONTH (DATE'2022-12-22', 'COMPATIBLE');
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22 |22 |22 |22 |
Snowflake¶
SELECT
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22');
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22 |22 |22 |22 |
ISO 달력¶
Teradata¶
SELECT DAYNUMBER_OF_MONTH (DATE'2022-12-22', 'ISO');
COLUMN1|
-------+
25 |
Snowflake¶
SELECT
PUBLIC.DAYNUMBER_OF_MONTH_UDF(DATE'2022-12-22');
COLUMN1|
-------+
25 |
알려진 문제 ¶
문제가 발견되지 않았습니다.
관련 EWIs ¶
관련 EWIs 없음.
FROM_BYTES¶
설명¶
FROM_BYTES 함수는 비트 시퀀스를 인코딩을 나타내는 문자 시퀀스로 인코딩합니다. 자세한 내용은 FROM_BYTES(Encoding)에서 확인할 수 있습니다.
Snowflake는 FROM_BYTES 함수를 지원하지 않지만, 이 함수의 가장 일반적인 발생에 대해 몇 가지 해결 방법을 사용할 수 있습니다.
샘플 소스 패턴¶
Teradata¶
SELECT
FROM_BYTES('5A1B'XB, 'base10'), --returns '23067'
FROM_BYTES('5A3F'XB, 'ASCII'), --returns 'Z\ESC '
FROM_BYTES('5A1B'XB, 'base16'); -- returns '5A1B'
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+---------+
23067 | Z\ESC | 5A1B |
Snowflake¶
SELECT
--returns '23067'
TO_NUMBER('5A1B', 'XXXX'),
--returns 'Z\ESC '
!!!RESOLVE EWI!!! /*** SSC-EWI-0031 - FROM_BYTES FUNCTION NOT SUPPORTED ***/!!!
FROM_BYTES(TO_BINARY('5A3F'), 'ASCII'),
TO_BINARY('5A1B', 'HEX'); -- returns '5A1B'
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+---------+
23067 | Z\ESC | 5A1B |
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
Known Issues¶
TO\NUMBER 형식 매개 변수는 입력 문자열의 자릿수와 일치해야 합니다.
ANSI 로 인코딩할 때 FROM_BYTES 에 상응하는 기본 제공 함수가 없습니다
관련 EWIs¶
SSC-EWI-0031: 지원되지 않는 함수
GETQUERYBANDVALUE¶
설명¶
GetQueryBandValue 함수는 쿼리 밴드 내에서 이름 키를 검색하고 이름 키가 있는 경우 관련 값을 반환합니다. 트랜잭션, 세션, 프로필 또는 쿼리 밴드의 키-값 페어 내부를 검색하는 데 사용할 수 있습니다.
이 함수에 대한 자세한 내용은 Teradata 설명서에서 GetQueryBandValue 섹션을 참조하십시오.
[SYSLIB.]GetQueryBandValue([QueryBandIn,] SearchType, Name);
샘플 소스 패턴¶
설정 데이터¶
Teradata¶
SET QUERY_BAND = 'hola=hello;adios=bye;' FOR SESSION;
Snowflake¶
ALTER SESSION SET QUERY_TAG = 'hola=hello;adios=bye;';
QueryBandIn 매개 변수 사용 GetQueryBandValue¶
Teradata¶
SELECT
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'account') as Example1,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'account') as Example2,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 2, 'account') as Example3,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 3, 'account') as Example4,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'role') as Example5,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'role') as Example6;
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200 | Mark200 | SaraDB | Peter3 | DbAdmin | |
+----------+----------+----------+----------+----------+----------+
Snowflake¶
SELECT
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'account') as Example1,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'account') as Example2,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 2, 'account') as Example3,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 3, 'account') as Example4,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'role') as Example5,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'role') as Example6;
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200 | Mark200 | SaraDB | Peter3 | DbAdmin | |
+----------+----------+----------+----------+----------+----------+
QueryBandIn 매개 변수 미사용 GetQueryBandValue¶
Teradata¶
SELECT
GETQUERYBANDVALUE(2, 'hola') as Example1,
GETQUERYBANDVALUE(2, 'adios') as Example2;
+----------+----------+
| EXAMPLE1 | EXAMPLE2 |
+----------+----------+
| hello | bye |
+----------+----------+
Snowflake¶
SELECT
GETQUERYBANDVALUE_UDF('hola') as Example1,
GETQUERYBANDVALUE_UDF('adios') as Example2;
+----------+----------+
| EXAMPLE1 | EXAMPLE2 |
+----------+----------+
| hello | bye |
+----------+----------+
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
Known Issues¶
1. QueryBandIn 매개 변수를 사용하지 않는 GetQueryBandValue 는 세션에만 지원됩니다
Teradata에서는 트랜잭션, 세션 또는 프로필 수준에서 쿼리 범위를 정의할 수 있습니다. 입력 쿼리 대역을 지정하지 않고 GetQueryBandValue 를 호출하면 Teradata는 SearchType 매개 변수의 값에 따라 트랜잭션, 세션 또는 프로필 쿼리 대역을 자동으로 확인합니다.
Snowflake에서 쿼리 밴드에 가장 가까운 것은 세션, 사용자 및 계정에 대해 지정할 수 있는 쿼리 태그입니다.
이러한 차이로 인해 QueryBandIn 매개 변수 없이 GetQueryBandValue 를 구현하면 세션 쿼리 태그만 고려되며 다른 검색 유형에서는 예상대로 작동하지 않을 수 있습니다.
관련 EWIs¶
관련 EWIs 없음.
JSON_CHECK¶
설명¶
JSON_CHECK 함수는 문자열에 유효한 JSON 이 있는지 확인합니다.
Teradata JSON_CHECK 에 대한 자세한 정보는 here에서 확인할 수 있습니다.
[TD_SYSFNLIB.]JSON_CHECK(string_expr);
샘플 소스 패턴¶
기본 소스 패턴¶
Teradata¶
SELECT JSON_CHECK('{"key": "value"}');
Snowflake Scripting¶
SELECT
IFNULL(CHECK_JSON('{"key": "value"}'), 'OK');
CASE 변환 내의 JSON_CHECK¶
Teradata¶
SELECT CASE WHEN JSON_CHECK('{}') = 'OK' then 'OKK' ELSE 'NOT OK' END;
Snowflake Scripting¶
SELECT
CASE
WHEN IFNULL(CHECK_JSON('{}'), 'OK') = 'OK'
THEN 'OKK' ELSE 'NOT OK'
END;
알려진 문제 ¶
문제가 발견되지 않았습니다.
관련 EWIs ¶
관련 EWIs 없음.
JSON_EXTRACT¶
설명¶
Teradata 설명서에 따르면, 이러한 함수는 JSONPath 쿼리 구문 을 사용하여 JSON 인스턴스의 일부에 대한 정보를 요청합니다. 원하는 엔터티는 이름/값 쌍, 오브젝트, 배열, 배열 요소 또는 값과 같은 JSON 인스턴스의 모든 부분이 될 수 있습니다.
Teradata JSONExtractValue, JSONExtractLargeValue, JSONExtract 에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.
JSON_expr.JSONExtractValue(JSONPath_expr)
JSON_expr.JSONExtractLargeValue(JSONPath_expr)
JSON_expr.JSONExtract(JSONPath_expr)
JSON_EXTRACT_UDF 는 Stefan Goessner 가 개발한 원래 JavaScript 구현의 수정된 버전을 사용하는 JSONPath 사양의 Snowflake 구현입니다.
샘플 소스 패턴¶
Teradata¶
SELECT
Store.JSONExtract('$..author') as AllAuthors,
Store.JSONExtractValue('$..book[2].title') as ThirdBookTitle,
Store.JSONExtractLargeValue('$..book[2].price') as ThirdBookPrice
FROM BookStores;
Snowflake Scripting¶
SELECT
JSON_EXTRACT_UDF(Store, '$..author', FALSE) as AllAuthors,
JSON_EXTRACT_UDF(Store, '$..book[2].title', TRUE) as ThirdBookTitle,
JSON_EXTRACT_UDF(Store, '$..book[2].price', TRUE) as ThirdBookPrice
FROM
BookStores;
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
Known Issues¶
1. Elements inside JSONs may not retain their original order.¶
JSON 내부의 요소는 테이블에 삽입될 때 키에 따라 정렬됩니다. 따라서 쿼리 결과가 다를 수 있습니다. 그러나 이는 JSON 내부의 배열 순서에는 영향을 미치지 않습니다.
예를 들어, 원본이 JSON 인 경우:
{
"firstName":"Peter",
"lastName":"Andre",
"age":31,
"cities": ["Los Angeles", "Lima", "Buenos Aires"]
}
입력 문자열을 JSON 문서로 해석하여 VARIANT 값을 생성하는 Snowflake PARSE_JSON()를 사용합니다. 삽입된 JSON 은:
{
"age": 31,
"cities": ["Los Angeles", "Lima", "Buenos Aires"],
"firstName": "Peter",
"lastName": "Andre"
}
이제 “age”가 첫 번째 요소가 된 것을 주목하십시오. 그러나 “cities”의 배열은 원래의 순서를 유지합니다.
관련 EWIs¶
관련 EWIs 없음.
JSON_TABLE¶
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
JSON 문서의 내용을 기반으로 테이블을 생성합니다. JSON_TABLE 설명서를 참조하십시오.
[TD_SYSFNLIB.]JSON_TABLE(
ON (json_documents_retrieving_expr)
USING
ROWEXPR (row_expr_literal)
COLEXPR (column_expr_literal)
[AS] correlation_name [(column_name [,...])]
)
JSON_TABLE 의 변환에는 다음과 같은 고려 사항이 있습니다.
ROW\NUMBER()는 Snowflake에서 서수 열에 해당합니다.
Teradata에서는 생성된 열이 두 번째 열을 대체하므로 JSON_TABLE 의 두 번째 열은 JSON 유형이어야 하며, 따라서 Snowconvert는 열의 유형이 올바른 것으로 가정하고 변환에 사용합니다.
샘플 소스 패턴¶
설정 데이터¶
Teradata¶
create table myJsonTable(
col1 integer,
col2 JSON(1000)
);
insert into myJsonTable values(1,
new json('{
"name": "Matt",
"age" : 30,
"songs" : [
{"name" : "Late night", "genre" : "Jazz"},
{"name" : "Wake up", "genre" : "Rock"},
{"name" : "Who am I", "genre" : "Rock"},
{"name" : "Raining", "genre" : "Blues"}
]
}'));
Snowflake¶
CREATE OR REPLACE TABLE myJsonTable (
col1 integer,
col2 VARIANT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO myJsonTable
VALUES (1, TO_JSON(PARSE_JSON('{
"name": "Matt",
"age" : 30,
"songs" : [
{"name" : "Late night", "genre" : "Jazz"},
{"name" : "Wake up", "genre" : "Rock"},
{"name" : "Who am I", "genre" : "Rock"},
{"name" : "Raining", "genre" : "Blues"}
]
}')));
패턴 코드 1¶
Teradata¶
SELECT * FROM
JSON_TABLE(ON (SELECT COL1, COL2 FROM myJsonTable WHERE col1 = 1)
USING rowexpr('$.songs[*]')
colexpr('[ {"jsonpath" : "$.name",
"type" : "CHAR(20)"},
{"jsonpath" : "$.genre",
"type" : "VARCHAR(20)"}]')) AS JT(ID, "Song name", Genre);
ID | Song name | Genre |
---+------------+-------+
1 | Late night | Jazz |
---+------------+-------+
1 | Wake up | Rock |
---+------------+-------+
1 | Who am I | Rock |
---+------------+-------+
1 | Raining | Blues |
Snowflake¶
SELECT
* FROM
(
SELECT
COL1 AS ID,
rowexpr.value:name :: CHAR(20) AS "Song name",
rowexpr.value:genre :: VARCHAR(20) AS Genre
FROM
myJsonTable,
TABLE(FLATTEN(INPUT => COL2:songs)) rowexpr
WHERE col1 = 1
) JT;
ID | Song name | Genre |
---+------------+-------+
1 | Late night | Jazz |
---+------------+-------+
1 | Wake up | Rock |
---+------------+-------+
1 | Who am I | Rock |
---+------------+-------+
1 | Raining | Blues |
Known Issues¶
1. COLEXPR 의 JSON 경로는 여러 개의 별표 액세스를 가질 수 없습니다
열 JSON 경로에는 별표 액세스가 있는 목록을 여러 개 가질 수 없습니다(예: $.Names[*].FullNames[*]
. 반면 ROWEXP 의 JSON 경로는 사용할 수 있습니다.
2. JSON 구조는 COLEXPR 리터럴에 정의된 유효한 JSON 이어야 합니다
그렇지 않은 경우 사용자에게 JSON 의 형식이 올바르지 않다는 경고가 표시됩니다.
관련 EWIs¶
관련 EWIs 없음.
NEW JSON¶
설명¶
JSON 데이터 타입의 새 인스턴스를 할당합니다. 자세한 내용은 NEW JSON 생성자 식에서 확인할 수 있습니다.
NEW JSON ( [ JSON_string_spec | JSON_binary_data_spec ] )
JSON_string_spec := JSON_String_literal [, { LATIN | UNICODE | BSON | UBJSON } ]
JSON_binary_data_spec := JSON_binary_literal [, { BSON | UBJSON } ]
NEW JSON 함수의 두 번째 매개 변수는 Snowflake가 UTF-8에서만 작동하기 때문에 SnowConvert 에서는 항상 생략됩니다.
샘플 소스 패턴¶
문자열 데이터 포함 NEW JSON¶
Teradata¶
SELECT NEW JSON ('{"name" : "cameron", "age" : 24}'),
NEW JSON ('{"name" : "cameron", "age" : 24}', LATIN);
COLUMN1 | COLUMN2 |
----------------------------+-----------------------------+
{"age":24,"name":"cameron"} | {"age":24,"name":"cameron"} |
Snowflake¶
SELECT
TO_JSON(PARSE_JSON('{"name" : "cameron", "age" : 24}')),
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'LATIN' NOT SUPPORTED ***/!!!
TO_JSON(PARSE_JSON('{"name" : "cameron", "age" : 24}'));
COLUMN1 | COLUMN2 |
----------------------------+-----------------------------+
{"age":24,"name":"cameron"} | {"age":24,"name":"cameron"} |
Known Issues¶
1. 두 번째 매개 변수는 지원되지 않습니다
결과 JSON 의 형식을 지정하는 데 사용되는 함수의 두 번째 매개 변수는 Snowflake가 UTF-8 만 지원하기 때문에 지원되지 않으며, 이로 인해 함수의 일부 용도에 따라 함수 차이가 발생할 수 있습니다.
2. BINARY 데이터를 포함한 JSON 은 지원되지 않습니다
Snowflake는 이진 데이터를 구문 분석하여 JSON 값을 생성하는 것을 지원하지 않으며, SnowConvert 가 이진 데이터로 작성된 NEW JSON 을 발견하면 사용자에게 경고가 표시됩니다.
관련 EWIs¶
SSC-EWI-TD0039: 지원되지 않는 입력 형식입니다.
NVP¶
설명¶
키가 검색할 지정한 이름의 n번째 항목과 일치하는 키-값 페어의 값을 추출합니다. NVP 섹션을 참조하십시오.
[TD_SYSFNLIB.] NVP (
in_string,
name_to_search
[, name_delimiters ]
[, value_delimiters ]
[, occurrence ]
)
샘플 소스 패턴¶
NVP 기본 케이스¶
Teradata¶
SELECT
NVP('entree=-orange chicken&entree+.honey salmon', 'entree', '&', '=- +.', 1),
NVP('Hello=bye|name=Lucas|Hello=world!', 'Hello', '|', '=', 2),
NVP('Player=Mario$Game&Tenis%Player/Susana$Game=Chess', 'Player', '% $', '= & /', 2);
COLUMN1 | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world! | Susana |
Snowflake¶
SELECT
PUBLIC.NVP_UDF('entree=-orange chicken&entree+.honey salmon', 'entree', '&', '=- +.', 1),
PUBLIC.NVP_UDF('Hello=bye|name=Lucas|Hello=world!', 'Hello', '|', '=', 2),
PUBLIC.NVP_UDF('Player=Mario$Game&Tenis%Player/Susana$Game=Chess', 'Player', '% $', '= & /', 2);
COLUMN1 | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world! | Susana |
선택적 매개 변수가 포함된 NVP 는 무시됨¶
Teradata¶
SELECT
NVP('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color'),
NVP('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color', 2),
NVP('City=Los Angeles#Color=Green#Color=Blue#City=San Jose', 'City', '#', '=');
COLUMN1 | COLUMN2 | COLUMN3 |
--------+---------+-------------+
Green | Blue | Los Angeles |
Snowflake¶
SELECT
PUBLIC.NVP_UDF('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color', '&', '=', 1),
PUBLIC.NVP_UDF('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color', '&', '=', 2),
PUBLIC.NVP_UDF('City=Los Angeles#Color=Green#Color=Blue#City=San Jose', 'City', '#', '=', 1);
COLUMN1 | COLUMN2 | COLUMN3 |
--------+---------+-------------+
Green | Blue | Los Angeles |
구분 기호에 공백이 있는 NVP¶
Teradata¶
SELECT
NVP('store = whole foods&&store: ?Bristol farms','store', '&&', '\ =\ :\ ?', 2),
NVP('Hello = bye|name = Lucas|Hello = world!', 'Hello', '|', '\ =\ ', 2);
COLUMN1 | COLUMN2 |
--------------+---------+
Bristol farms | world! |
Snowflake¶
SELECT
PUBLIC.NVP_UDF('store = whole foods&&store: ?Bristol farms', 'store', '&&', '\\ =\\ :\\ ?', 2),
PUBLIC.NVP_UDF('Hello = bye|name = Lucas|Hello = world!', 'Hello', '|', '\\ =\\ ', 2);
COLUMN1 | COLUMN2 |
--------------+---------+
Bristol farms | world! |
리터럴이 아닌 구분 기호가 있는 NVP¶
Teradata¶
SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
Snowflake¶
SELECT
PUBLIC.NVP_UDF('store = whole foods&&store: ?Bristol farms', 'store', '&&', valueDelimiter, 2) /*** SSC-FDM-TD0008 - WHEN NVP_UDF FOURTH PARAMETER IS NON-LITERAL AND IT CONTAINS A BACKSLASH, THAT BACKSLASH NEEDS TO BE ESCAPED ***/;
Known Issues¶
1. 공백()이 있는 구분 기호는 Snowflake에서 백슬래시를 스케이프해야 합니다
Teradata에서는 공백을 포함한 구분 기호는 “\ “를 사용하여 지정합니다(구분 기호에 공백이 포함된 NVP 참조). 예제에서 볼 수 있듯이 Teradata에서는 백슬래시를 이스케이프 처리할 필요가 없지만, Snowflake에서는 이스케이프 처리가 필요합니다. 구분 기호에서 백슬래시 이스케이프는 SnowConvert 에서 자동으로 수행할 수 있지만 구분 기호 값이 리터럴 문자열인 경우에만 가능하며, 그렇지 않은 경우 사용자에게 백슬래시를 이스케이프할 수 없으며 Snowflake에서 다른 결과가 발생할 수 있다는 경고가 표시됩니다.
관련 EWIs¶
SSC-FDM-TD0008: 공백이 있는 리터럴이 아닌 구분 기호는 백슬래시를 Snowflake로 이스케이프해야 합니다.
OVERLAPS¶
설명¶
Teradata의 설명서에 따르면 OVERLAPS 연산자는 2개 이상의 기간 식을 비교합니다. 겹치면 true을 반환합니다.
Teradata의 OVERLAPS 에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.
period_expression
OVERLAPS
period_expression
PERIOD_OVERLAPS_UDF 는 Teradata의 OVERLAPS 연산자를 Snowflake로 구현한 것입니다.
샘플 소스 패턴¶
Teradata¶
SELECT
PERIOD(DATE '2009-01-01', DATE '2010-09-24')
OVERLAPS
PERIOD(DATE '2009-02-01', DATE '2009-06-24');
Snowflake Scripting¶
SELECT
PUBLIC.PERIOD_OVERLAPS_UDF(ARRAY_CONSTRUCT(PUBLIC.PERIOD_UDF(DATE '2009-01-01', DATE '2010-09-24') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!, PUBLIC.PERIOD_UDF(DATE '2009-02-01', DATE '2009-06-24') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!)) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!;
Known Issues¶
1. Unsupported Period Expressions¶
PERIOD(TIME WITH TIME ZONE) 및 PERIOD(TIMESTAMP WITH TIME ZONE) 식은 아직 지원되지 않습니다.
관련 EWIs¶
SSC-EWI-TD0053: Snowflake는 기간 데이터 타입을 지원하지 않으며, 대신 모든 기간이 varchar로 처리됩니다.
P_INTERSECT¶
설명¶
Teradata 설명서에 따르면, P_INTERSECT 연산자는 2개 이상의 기간 식을 비교합니다. 중첩되는 경우 기간 식의 공통 부분을 반환합니다.
Teradata의 P_INTERSECT 에 대한 자세한 내용은 여기를 클릭하십시오.
period_expression
P_INTERSECT
period_expression
PERIOD_INTERSECT_UDF 는 Teradata의 P_INTERSECT 연산자를 Snowflake로 구현한 것입니다.
샘플 소스 패턴¶
Teradata¶
SELECT
PERIOD(DATE '2009-01-01', DATE '2010-09-24')
P_INTERSECT
PERIOD(DATE '2009-02-01', DATE '2009-06-24');
Snowflake Scripting¶
SELECT
PUBLIC.PERIOD_INTERSECT_UDF(ARRAY_CONSTRUCT(PUBLIC.PERIOD_UDF(DATE '2009-01-01', DATE '2010-09-24') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!, PUBLIC.PERIOD_UDF(DATE '2009-02-01', DATE '2009-06-24') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!)) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!;
Known Issues¶
1. Unsupported Period Expressions¶
PERIOD(TIME WITH TIME ZONE) 및 PERIOD(TIMESTAMP WITH TIME ZONE) 식은 아직 지원되지 않습니다.
관련 EWIs¶
SSC-EWI-TD0053: Snowflake는 기간 데이터 타입을 지원하지 않으며, 대신 모든 기간이 varchar로 처리됩니다.
PIVOT¶
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
피벗 함수는 테이블의 행을 열로 변환하는 데 사용됩니다. 자세한 내용은 PIVOT Teradata 설명서를 참조하십시오.
PIVOT ( pivot_spec )
[ WITH with_spec [,...] ]
[AS] derived_table_name [ ( cname [,...] ) ]
pivot_spec := aggr_fn_spec [,...] FOR for_spec
aggr_fn_spec := aggr_fn ( cname ) [ [AS] pvt_aggr_alias ]
for_spec := { cname IN ( expr_spec_1 [,...] ) |
( cname [,...] ) IN ( expr_spec_2 [,...] ) |
cname IN ( subquery )
}
expr_spec_1 := expr [ [AS] expr_alias_name ]
expr_spec_2 := ( expr [,...] ) [ [AS] expr_alias_name ]
with_spec := aggr_fn ( { cname [,...] | * } ) [AS] aggr_alias
샘플 소스 패턴¶
설정 데이터¶
Teradata¶
CREATE TABLE star1(
country VARCHAR(20),
state VARCHAR(10),
yr INTEGER,
qtr VARCHAR(3),
sales INTEGER,
cogs INTEGER
);
insert into star1 values ('USA', 'CA', 2001, 'Q1', 30, 15);
insert into star1 values ('Canada', 'ON', 2001, 'Q2', 10, 0);
insert into star1 values ('Canada', 'BC', 2001, 'Q3', 10, 0);
insert into star1 values ('USA', 'NY', 2001, 'Q1', 45, 25);
insert into star1 values ('USA', 'CA', 2001, 'Q2', 50, 20);
Snowflake¶
CREATE OR REPLACE TABLE star1 (
country VARCHAR(20),
state VARCHAR(10),
yr INTEGER,
qtr VARCHAR(3),
sales INTEGER,
cogs INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO star1
VALUES ('USA', 'CA', 2001, 'Q1', 30, 15);
INSERT INTO star1
VALUES ('Canada', 'ON', 2001, 'Q2', 10, 0);
INSERT INTO star1
VALUES ('Canada', 'BC', 2001, 'Q3', 10, 0);
INSERT INTO star1
VALUES ('USA', 'NY', 2001, 'Q1', 45, 25);
INSERT INTO star1
VALUES ('USA', 'CA', 2001, 'Q2', 50, 20);
기본 PIVOT 변환¶
Teradata¶
SELECT *
FROM star1 PIVOT (
SUM(sales) FOR qtr
IN ('Q1',
'Q2',
'Q3')
)Tmp;
Country | State | yr | cogs | 'Q1' | 'Q2' | 'Q3' |
--------+-------+------+------+------+------+------+
Canada | BC | 2001 | 0 | null | null | 10 |
--------+-------+------+------+------+------+------+
USA | NY | 2001 | 25 | 45 | null | null |
--------+-------+------+------+------+------+------+
Canada | ON | 2001 | 0 | null | 10 | null |
--------+-------+------+------+------+------+------+
USA | CA | 2001 | 20 | null | 50 | null |
--------+-------+------+------+------+------+------+
USA | CA | 2001 | 15 | 30 | null | null |
--------+-------+------+------+------+------+------+
Snowflake¶
SELECT
*
FROM
star1 PIVOT(
SUM(sales) FOR qtr IN ('Q1',
'Q2',
'Q3'))Tmp;
Country | State | yr | cogs | 'Q1' | 'Q2' | 'Q3' |
--------+-------+------+------+------+------+------+
Canada | BC | 2001 | 0 | null | null | 10 |
--------+-------+------+------+------+------+------+
USA | NY | 2001 | 25 | 45 | null | null |
--------+-------+------+------+------+------+------+
Canada | ON | 2001 | 0 | null | 10 | null |
--------+-------+------+------+------+------+------+
USA | CA | 2001 | 20 | null | 50 | null |
--------+-------+------+------+------+------+------+
USA | CA | 2001 | 15 | 30 | null | null |
--------+-------+------+------+------+------+------+
별칭 변환을 사용한 PIVOT¶
Teradata¶
SELECT *
FROM star1 PIVOT (
SUM(sales) as ss1 FOR qtr
IN ('Q1' AS Quarter1,
'Q2' AS Quarter2,
'Q3' AS Quarter3)
)Tmp;
Country | State | yr | cogs | Quarter1_ss1 | Quarter2_ss1 | Quarter3_ss1 |
--------+-------+------+------+--------------+--------------+--------------+
Canada | BC | 2001 | 0 | null | null | 10 |
--------+-------+------+------+--------------+--------------+--------------+
USA | NY | 2001 | 25 | 45 | null | null |
--------+-------+------+------+--------------+--------------+--------------+
Canada | ON | 2001 | 0 | null | 10 | null |
--------+-------+------+------+--------------+--------------+--------------+
USA | CA | 2001 | 20 | null | 50 | null |
--------+-------+------+------+--------------+--------------+--------------+
USA | CA | 2001 | 15 | 30 | null | null |
--------+-------+------+------+--------------+--------------+--------------+
Snowflake¶
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
star1 PIVOT(
SUM(sales) FOR qtr IN (
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
'Q1',
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
'Q2',
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
'Q3'))Tmp;
Country | State | yr | cogs | Quarter1_ss1 | Quarter2_ss1 | Quarter3_ss1 |
--------+-------+------+------+--------------+--------------+--------------+
Canada | BC | 2001 | 0 | null | null | 10 |
--------+-------+------+------+--------------+--------------+--------------+
USA | NY | 2001 | 25 | 45 | null | null |
--------+-------+------+------+--------------+--------------+--------------+
Canada | ON | 2001 | 0 | null | 10 | null |
--------+-------+------+------+--------------+--------------+--------------+
USA | CA | 2001 | 20 | null | 50 | null |
--------+-------+------+------+--------------+--------------+--------------+
USA | CA | 2001 | 15 | 30 | null | null |
--------+-------+------+------+--------------+--------------+--------------+
Known Issues¶
1. WITH 절은 지원되지 않음
WITH 절을 사용하는 것은 현재 지원되지 않습니다.
2. 여러 피벗 열에 대한 피벗은 지원되지 않음
Snowconvert는 PIVOT 함수를 단일 열에만 적용하는 것을 지원하는 Snowflake에서 PIVOT 함수로 변환하고 있습니다.
3. 여러 집계 함수가 있는 피벗은 지원되지 않음
Snowflake의 PIVOT 함수는 데이터에 1개의 집계 함수만 적용하는 것을 지원합니다.
4. IN 절의 하위 쿼리는 지원되지 않습니다
Snowflake PIVOT 함수의 IN 절은 하위 쿼리를 허용하지 않습니다.
5. 별칭은 모든 IN 절 요소에 별칭이 있고 테이블 사양이 있는 경우에만 지원됩니다
별칭이 있는 열 이름이 동등하려면 IN 절에 지정된 모든 값에 별칭이 1개씩 지정되고 입력 코드에 테이블 사양이 있어야 SnowConvert 에서 결과 테이블의 별칭 목록을 성공적으로 생성할 수 있으므로 SnowConvert 가 필요합니다.
관련 EWIs¶
SSC-EWI-0015: 입력 피벗/피벗 해제 문 양식은 지원되지 않습니다
RANK¶
설명¶
RANK 는 결과 세트를 정렬하고 결과에서 각 행의 숫자 순위를 식별합니다. RANK 의 유일한 인자는 정렬 열(또는 열)이며 함수는 결과에서 각 행의 순위를 나타내는 정수를 반환합니다. (Teradata의 RANK )
Teradata 구문¶
RANK ( sort_expression [ ASC | DESC ] [,...] )
Snowflake 구문¶
RANK() OVER
(
[ PARTITION BY <expr1> ]
ORDER BY <expr2> [ { ASC | DESC } ]
[ <window_frame> ]
)
샘플 소스 패턴¶
설정 데이터¶
Teradata¶
CREATE TABLE Sales (
Product VARCHAR(255),
Sales INT
);
INSERT INTO Sales (Product, Sales) VALUES ('A', 100);
INSERT INTO Sales (Product, Sales) VALUES ('B', 150);
INSERT INTO Sales (Product, Sales) VALUES ('C', 200);
INSERT INTO Sales (Product, Sales) VALUES ('D', 150);
INSERT INTO Sales (Product, Sales) VALUES ('E', 120);
INSERT INTO Sales (Product, Sales) VALUES ('F', NULL);
Snowflake¶
CREATE OR REPLACE TABLE Sales (
Product VARCHAR(255),
Sales INT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO Sales (Product, Sales)
VALUES ('A', 100);
INSERT INTO Sales (Product, Sales)
VALUES ('B', 150);
INSERT INTO Sales (Product, Sales)
VALUES ('C', 200);
INSERT INTO Sales (Product, Sales)
VALUES ('D', 150);
INSERT INTO Sales (Product, Sales)
VALUES ('E', 120);
INSERT INTO Sales (Product, Sales)
VALUES ('F', NULL);
ASC, DESC, DEFAULT 명령을 사용한 RANK()¶
Teradata¶
경고
RANK()를 호출할 때 Teradata의 명령의 기본값은 DESC 입니다. 그러나 Snowflake의 기본값은 ASC 입니다. 따라서 순서가 지정되지 않은 경우 RANK()의 변환에 DESC 가 추가됩니다.
SELECT
Sales,
RANK(Sales ASC) AS SalesAsc,
RANK(Sales DESC) AS SalesDesc,
RANK(Sales) AS SalesDefault
FROM
Sales;
SALES | SALESASC | SALESDESC | SALESDEFAULT |
---|---|---|---|
NULL | 6 | 6 | 6 |
200 | 5 | 1 | 1 |
150 | 3 | 2 | 2 |
150 | 3 | 2 | 2 |
120 | 2 | 4 | 4 |
100 | 1 | 5 | 5 |
Snowflake¶
SELECT
Sales,
RANK() OVER (
ORDER BY
Sales ASC) AS SalesAsc,
RANK() OVER (
ORDER BY
Sales DESC NULLS LAST) AS SalesDesc,
RANK() OVER (
ORDER BY
Sales DESC NULLS LAST) AS SalesDefault
FROM
Sales;
SALES | SALESASC | SALESDESC | SALESDEFAULT |
---|---|---|---|
NULL | 6 | 6 | 6 |
200 | 5 | 1 | 1 |
150 | 3 | 2 | 2 |
150 | 3 | 2 | 2 |
120 | 2 | 4 | 4 |
100 | 1 | 5 | 5 |
알려진 문제 ¶
문제가 발견되지 않았습니다.
관련 EWIs ¶
관련 EWIs 없음.
정규식 함수¶
설명¶
Teradata와 Snowflake는 모두 varchar 입력에 정규식을 적용하는 함수를 지원합니다. 자세한 내용은 Teradata 설명서 및 Snowflake 설명서 를 참조하십시오.
REGEXP_SUBSTR(source. regexp [, position, occurrence, match])
REGEXP_REPLACE(source. regexp [, replace_string, position, occurrence, match])
REGEXP_INSTR(source. regexp [, position, occurrence, return_option, match])
REGEXP_SIMILAR(source. regexp [, match])
REGEXP_SPLIT_TO_TABLE(inKey. source. regexp, match)
샘플 소스 패턴¶
설정 데이터¶
Teradata¶
CREATE TABLE regexpTable
(
col1 CHAR(35)
);
INSERT INTO regexpTable VALUES('hola');
Snowflake¶
CREATE OR REPLACE TABLE regexpTable
(
col1 CHAR(35)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO regexpTable
VALUES ('hola');
정규식 변환 예제¶
Teradata¶
SELECT
REGEXP_REPLACE(col1,'.*(h(i|o))','ha', 1, 0, 'x'),
REGEXP_SUBSTR(COL1,'.*(h(i|o))', 2, 1, 'x'),
REGEXP_INSTR(COL1,'.*(h(i|o))',1, 1, 0, 'x'),
REGEXP_SIMILAR(COL1,'.*(h(i|o))', 'xl')
FROM regexpTable;
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala |null |1 |0 |
Snowflake¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "regexpTable" **
SELECT
REGEXP_REPLACE(col1, '.*(h(i|o))', 'ha', 1, 0),
REGEXP_SUBSTR(COL1, '.*(h(i|o))', 2, 1),
REGEXP_INSTR(COL1, '.*(h(i|o))', 1, 1, 0),
--** SSC-FDM-TD0016 - VALUE 'l' FOR PARAMETER 'match_arg' IS NOT SUPPORTED IN SNOWFLAKE **
REGEXP_LIKE(COL1, '.*(h(i|o))')
FROM
regexpTable;
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala |null |1 |FALSE |
Known Issues¶
1. Snowflake는 POSIX 정규식만 지원합니다
SnowConvert 가 POSIX 가 아닌 정규식을 발견하면 사용자에게 경고가 표시됩니다.
2. Teradata “match_arg” 옵션 ‘l’은 Snowflake에서 지원되지 않습니다
‘l’ 옵션은 Snowflake에 대응하는 옵션이 없으며 SnowConvert 가 이를 발견하면 사용자에게 경고가 표시됩니다.
3. CHAR 데이터 타입의 수정된 크기로 인해 다른 동작이 발생할 수 있습니다
Teradata의 일부 정규식 함수는 더 작은 문자열이 삽입되어 열의 일부 문자가 비어 있는 경우에도 테이블에서 CHAR 데이터 타입의 전체 열을 일치시키려고 시도합니다. Snowflake에서는 CHAR 데이터 타입이 가변 크기이기 때문에 이런 일이 발생하지 않습니다.
4. REGEXP_SPLIT_TO_TABLE 지원되지 않음
이 함수는 현재 Snowflake에서 지원되지 않습니다.
관련 EWIs¶
SSC-FDM-0007: 종속성이 누락된 요소.
SSC-FDM-TD0016: 매개 변수 ‘match_arg’의 값 ‘l’은 Snowflake에서 지원되지 않습니다.
STRTOK_SPLIT_TO_TABLE¶
설명¶
제공된 구분 기호를 사용하여 문자열을 테이블로 분할합니다. 자세한 내용은 STRTOK_SPLIT_TO_TABLE에서 확인할 수 있습니다.
[TD_SYSFNLIB.] STRTOK_SPLIT_TO_TABLE ( inkey, instring, delimiters )
RETURNS ( outkey, tokennum, token )
샘플 소스 패턴¶
설정 데이터¶
Teradata¶
CREATE TABLE strtokTable
(
col1 INTEGER,
col2 VARCHAR(100)
);
INSERT INTO strtokTable VALUES(4, 'hello-world-split-me');
INSERT INTO strtokTable VALUES(1, 'string$split$by$dollars');
Snowflake¶
CREATE OR REPLACE TABLE strtokTable
(
col1 INTEGER,
col2 VARCHAR(100)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO strtokTable
VALUES (4, 'hello-world-split-me');
INSERT INTO strtokTable
VALUES (1, 'string$split$by$dollars');
STRTOK_SPLIT_TO_TABLE 변환¶
Teradata¶
SELECT outkey, tokennum, token FROM table(STRTOK_SPLIT_TO_TABLE(strtokTable.col1, strtokTable.col2, '-$')
RETURNS (outkey INTEGER, tokennum INTEGER, token VARCHAR(100))) AS testTable
ORDER BY outkey, tokennum;
outkey |tokennum | token |
-------+---------+--------+
1 |1 |string |
-------+---------+--------+
1 |2 |split |
-------+---------+--------+
1 |3 |by |
-------+---------+--------+
1 |4 |dollars |
-------+---------+--------+
4 |1 |hello |
-------+---------+--------+
4 |2 |world |
-------+---------+--------+
4 |3 |split |
-------+---------+--------+
4 |4 |me |
Snowflake¶
SELECT
CAST(strtokTable.col1 AS INTEGER) AS outkey,
CAST(INDEX AS INTEGER) AS tokennum,
CAST(VALUE AS VARCHAR) AS token
FROM
strtokTable,
table(STRTOK_SPLIT_TO_TABLE(strtokTable.col2, '-$')) AS testTable
ORDER BY outkey, tokennum;
outkey |tokennum | token |
-------+---------+--------+
1 |1 |string |
-------+---------+--------+
1 |2 |split |
-------+---------+--------+
1 |3 |by |
-------+---------+--------+
1 |4 |dollars |
-------+---------+--------+
4 |1 |hello |
-------+---------+--------+
4 |2 |world |
-------+---------+--------+
4 |3 |split |
-------+---------+--------+
4 |4 |me |
Known Issues¶
알려진 문제 없음.
관련 EWIs ¶
관련 EWIs 없음.
SUBSTRING¶
설명¶
지정된 입력 문자열에서 하위 문자열을 추출합니다. 자세한 내용은 SUBSTRING/SUBSTR.에서 확인할 수 있습니다.
SUBSTRING(string_expr FROM n1 [FOR n2])
SUBSTR(string_expr, n1, [, n2])
하위 문자열 (n1)을 가져올 값이 1보다 작으면 SUBSTR_UDF 가 대신 삽입됩니다.
샘플 소스 패턴¶
SUBSTRING 변환¶
Teradata¶
SELECT SUBSTR('Hello World!', 2, 6),
SUBSTR('Hello World!', -2, 6),
SUBSTRING('Hello World!' FROM 2 FOR 6),
SUBSTRING('Hello World!' FROM -2 FOR 6);
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W |Hel |ello W |Hel |
Snowflake¶
SELECT
SUBSTR('Hello World!', 2, 6),
PUBLIC.SUBSTR_UDF('Hello World!', -2, 6),
SUBSTRING('Hello World!', 2, 6),
PUBLIC.SUBSTR_UDF('Hello World!', -2, 6);
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W |Hel |ello W |Hel |
관련 EWIs¶
관련 EWIs 없음.
TD_UNPIVOT¶
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
TD_UNPIVOT
은 한 번에 여러 열의 피벗을 해제할 수 있지만, Snowflake UNPIVOT
는 단일 열의 피벗만 해제할 수 있습니다. unpivot 기능은 지정된 테이블의 열을 행으로 변환하는 데 사용됩니다. 자세한 내용은 TD_UNPIVOT을 참조하십시오.
[TD_SYSFNLIB.] TD_UNPIVOT (
ON { tableName | ( query_expression ) }
USING VALUE_COLUMNS ( 'value_columns_value' [,...] )
UNPIVOT_COLUMN ( 'unpivot_column_value' )
COLUMN_LIST ( 'column_list_value' [,...] )
[ COLUMN_ALIAS_LIST ( 'column_alias_list_value' [,...] )
INCLUDE_NULLS ( { 'No' | 'Yes' } )
]
)
다음 변환은 Teradata에서 작동하는 것과 동일한 방식으로 여러 열의 피벗을 동시에 해제하는 SQL 쿼리를 Snowflake에서 생성할 수 있습니다.
샘플 소스 패턴¶
데이터 제목 설정¶
Teradata¶
CREATE TABLE superunpivottest (
myKey INTEGER NOT NULL PRIMARY KEY,
firstSemesterIncome DECIMAL(10,2),
secondSemesterIncome DECIMAL(10,2),
firstSemesterExpenses DECIMAL(10,2),
secondSemesterExpenses DECIMAL(10,2)
);
INSERT INTO superUnpivottest VALUES (2020, 15440, 25430.57, 10322.15, 12355.36);
INSERT INTO superUnpivottest VALUES (2018, 18325.25, 25220.65, 15560.45, 15680.33);
INSERT INTO superUnpivottest VALUES (2019, 23855.75, 34220.22, 14582.55, 24122);
Snowflake¶
CREATE OR REPLACE TABLE superunpivottest (
myKey INTEGER NOT NULL PRIMARY KEY,
firstSemesterIncome DECIMAL(10,2),
secondSemesterIncome DECIMAL(10,2),
firstSemesterExpenses DECIMAL(10,2),
secondSemesterExpenses DECIMAL(10,2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO superUnpivottest
VALUES (2020, 15440, 25430.57, 10322.15, 12355.36);
INSERT INTO superUnpivottest
VALUES (2018, 18325.25, 25220.65, 15560.45, 15680.33);
INSERT INTO superUnpivottest
VALUES (2019, 23855.75, 34220.22, 14582.55, 24122);
TD_UNPIVOT 변환¶
Teradata¶
SELECT * FROM
TD_UNPIVOT(
ON superunpivottest
USING
VALUE_COLUMNS('Income', 'Expenses')
UNPIVOT_COLUMN('Semester')
COLUMN_LIST('firstSemesterIncome, firstSemesterExpenses', 'secondSemesterIncome, secondSemesterExpenses')
COLUMN_ALIAS_LIST('First', 'Second')
)X ORDER BY mykey, Semester;
myKey |Semester |Income | Expenses |
------+---------+---------+----------+
2018 |First |18325.25 |15560.45 |
------+---------+---------+----------+
2018 |Second |25220.65 |15680.33 |
------+---------+---------+----------+
2019 |First |23855.75 |14582.55 |
------+---------+---------+----------+
2019 |Second |34220.22 |24122.00 |
------+---------+---------+----------+
2020 |First |15440.00 |10322.15 |
------+---------+---------+----------+
2020 |Second |25430.57 |12355.36 |
Snowflake¶
SELECT
* FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0061 - TD_UNPIVOT TRANSFORMATION REQUIRES COLUMN INFORMATION THAT COULD NOT BE FOUND, COLUMNS MISSING IN RESULT ***/!!!
(
SELECT
TRIM(GET_IGNORE_CASE(OBJECT_CONSTRUCT('FIRSTSEMESTERINCOME', 'First', 'FIRSTSEMESTEREXPENSES', 'First', 'SECONDSEMESTERINCOME', 'Second', 'SECONDSEMESTEREXPENSES', 'Second'), Semester), '"') AS Semester,
Income,
Expenses
FROM
superunpivottest UNPIVOT(Income FOR Semester IN (
firstSemesterIncome,
secondSemesterIncome
)) UNPIVOT(Expenses FOR Semester1 IN (
firstSemesterExpenses,
secondSemesterExpenses
))
WHERE
Semester = 'FIRSTSEMESTERINCOME'
AND Semester1 = 'FIRSTSEMESTEREXPENSES'
OR Semester = 'SECONDSEMESTERINCOME'
AND Semester1 = 'SECONDSEMESTEREXPENSES'
) X ORDER BY mykey, Semester;
myKey |Semester |Income | Expenses |
------+---------+---------+----------+
2018 |First |18325.25 |15560.45 |
------+---------+---------+----------+
2018 |Second |25220.65 |15680.33 |
------+---------+---------+----------+
2019 |First |23855.75 |14582.55 |
------+---------+---------+----------+
2019 |Second |34220.22 |24122.00 |
------+---------+---------+----------+
2020 |First |15440.00 |10322.15 |
------+---------+---------+----------+
2020 |Second |25430.57 |12355.36 |
Known Issues¶
INCLUDE_NULLS 이 YES 로 설정된 TD_UNPIVOT 절은 지원되지 않습니다
변환에 사용되는 Snowflake UNPIVOT 함수는 항상 null 값을 무시하며, INCLUDE_NULLS 이 YES 로 설정된 절의 경우 사용자에게 지원되지 않는다는 경고가 표시됩니다.
함수를 올바르게 변환하려면 테이블 정보가 필요합니다
SnowConvert 에는 TD_UNPIVOT 함수에서 사용 중인 열의 이름이 필요합니다. 사용자가 함수의 query_expression에 열 목록을 포함하지 않고 피벗 해제 중인 테이블의 이름을 제공하면 테이블 정의에서 열 이름을 검색하려고 시도합니다. 이름을 찾을 수 없는 경우 사용자에게 쿼리 결과에서 열이 손실될 수 있다는 경고가 표시됩니다.
관련 EWIs¶
SSC-EWI-TD0061: TD\UNPIVOT 변환에는 찾을 수 없는 열 정보, 결과에서 누락된 열이 필요합니다.
TO_CHAR¶
설명¶
TO_CHAR 함수는 DateTime 또는 숫자 값을 문자열로 형 변환합니다. 자세한 내용은 TO_CHAR(Numeric) 및 TO_CHAR(DateTime)에서 확인할 수 있습니다.
-- Numeric version
[TD_SYSFNLIB.]TO_CHAR(numeric_expr [, format_arg [, nls_param]])
-- DateTime version
[TD_SYSFNLIB.]TO_CHAR(dateTime_expr [, format_arg])
Snowflake와 Teradata 모두 TO_CHAR 함수의 자체 버전이 있지만, Teradata는 Snowflake에서 기본적으로 지원되지 않는 많은 형식을 지원합니다. 이러한 형식 요소를 지원하기 위해 SnowConvert 는 Snowflake 기본 제공 함수 및 사용자 지정 UDFs 를 사용하여 Teradata의 원본 TO_CHAR 함수와 동일한 문자열을 생성하는 연결 식을 생성합니다.
샘플 소스 패턴¶
TO_CHAR(DateTime) 변환¶
Teradata¶
SELECT
TO_CHAR(date '2012-12-23'),
TO_CHAR(date '2012-12-23', 'DS'),
TO_CHAR(date '2012-12-23', 'DAY DD, MON YY');
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
Snowflake¶
SELECT
TO_CHAR(date '2012-12-23') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
TO_CHAR(date '2012-12-23', 'MM/DD/YYYY') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
PUBLIC.DAYNAME_LONG_UDF(date '2012-12-23', 'uppercase') || TO_CHAR(date '2012-12-23', ' DD, ') || PUBLIC.MONTH_SHORT_UDF(date '2012-12-23', 'uppercase') || TO_CHAR(date '2012-12-23', ' YY') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
TO_CHAR(Numeric) 변환¶
Teradata¶
SELECT
TO_CHAR(1255.495),
TO_CHAR(1255.495, '9.9EEEE'),
TO_CHAR(1255.495, 'SC9999.9999', 'nls_iso_currency = ''EUR''');
COLUMN1 | COLUMN2 | COLUMN3 |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |
Snowflake¶
SELECT
TO_CHAR(1255.495) /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
TO_CHAR(1255.495, '9.0EEEE') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
PUBLIC.INSERT_CURRENCY_UDF(TO_CHAR(1255.495, 'S9999.0000'), 2, 'EUR') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;
COLUMN1 | COLUMN2 | COLUMN3 |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |
Known Issues¶
1. 동작이 다르거나 지원되지 않는 형식
Teradata는 TO_CHAR 함수를 변환한 후 Snowflake에서 다른 동작을 보일 수 있는 광범위한 형식 요소 목록을 제공합니다. 동작이 다르거나 지원되지 않는 요소 목록은 SSC-EWI-TD0029를 참조하십시오.
관련 EWIs¶
SSC-FDM-TD0029: TO_CHAR 에 대한 Snowflake 지원 형식은 Teradata 와 다르며 실패하거나 동작이 다를 수 있습니다.
XMLAGG¶
설명¶
여러 행의 집계를 수행하여 XML 값을 작성합니다. 자세한 내용은 XMLAGG 에서 확인할 수 있습니다.
XMLAGG (
XML_value_expr
[ ORDER BY order_by_spec [,...] ]
[ RETURNING { CONTENT | SEQUENCE } ]
)
order_by_spec := sort_key [ ASC | DESC ] [ NULLS { FIRST | LAST } ]
샘플 소스 패턴¶
설정 데이터¶
Teradata¶
create table orders (
o_orderkey int,
o_totalprice float);
insert into orders values (1,500000);
insert into orders values (2,100000);
insert into orders values (3,600000);
insert into orders values (4,700000);
Snowflake¶
CREATE OR REPLACE TABLE orders (
o_orderkey int,
o_totalprice float)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO orders
VALUES (1,500000);
INSERT INTO orders
VALUES (2,100000);
INSERT INTO orders
VALUES (3,600000);
INSERT INTO orders
VALUES (4,700000);
XMLAGG 변환¶
Teradata¶
select
xmlagg(o_orderkey order by o_totalprice desc) (varchar(10000))
from orders
where o_totalprice > 5;
COLUMN1 |
--------+
4 3 1 2 |
Snowflake¶
SELECT
LEFT(TO_VARCHAR(LISTAGG ( o_orderkey, ' ')
WITHIN GROUP(
order by o_totalprice DESC NULLS LAST)), 10000)
from
orders
where o_totalprice > 5;
COLUMN1 |
--------+
4 3 1 2 |
Known Issues¶
1. RETURNING 절은 현재 지원되지 않습니다.
사용자에게 반환 절의 변환이 향후 추가될 것이라는 경고가 표시됩니다.
관련 EWIs ¶
관련 EWIs 없음.