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
CURTIME

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’)
DAYNUMBER_OF_WEEK(DatetimeValue)

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

DAYOFMONTH

TD_DAY_OF_WEEK
DAYOFWEEK

TD_DAY_OF_WEEK_UDF

TD_DAY_OF_YEAR

DAYOFYEAR

TD_MONTH_OF_CALENDAR(DateTimeValue)
MONTH_CALENDAR(DateTimeValue)

TD_MONTH_OF_CALENDAR_UDF(DateTimeValue)

TD_WEEK_OF_CALENDAR(DateTimeValue)
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

INTERVAL 데이터 타입으로 변환 확인

TRYCAST

TRY_CAST

FROM_BYTES

TO_NUMBER
TO_BINARY

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

DateTime 및 간격 함수 및 식 참조

해시 함수

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
JSONExtractLargeValue

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(datetimeValue, UNTIL_CLOSED)

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_DISTANCE

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');
Copy

4를 반환하고, CHARINDEX 는 Snowflake에 해당합니다.

 SELECT CHARINDEX('5', 35);
Copy

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'));
Copy

그러면 Teradata 코드와 동일한 4가 반환됩니다.

알려진 문제

문제가 발견되지 않았습니다.

숫자 데이터 타입에서 Varchar 데이터 타입으로 형 변환

varchar로 형 변환할 때 Teradata는 각 숫자 데이터 타입에 대해 기본 형식을 사용하므로, Snowconvert는 플랫폼 간에 동등성을 유지하기 위해 형식을 추가합니다.

샘플 소스 패턴

BYTEINT

Teradata
 SELECT '"'||cast(cast(12 as BYTEINT) as varchar(10))||'"';
Copy
(('"'||12)||'"')|
----------------+
"12"            |

Copy
Snowflake
 SELECT
'"'|| LEFT(TO_VARCHAR(cast(12 as BYTEINT), 'TM'), 10) ||'"';
Copy
"'""'|| LEFT(TO_VARCHAR(CAST(12 AS BYTEINT), 'TM'), 10) ||'""'"
---------------------------------------------------------------
"12"            

Copy

SMALLINT

Teradata
 SELECT '"'||cast(cast(123 as SMALLINT) as varchar(10))||'"';
Copy
(('"'||123)||'"')|
-----------------+
"123"            |

Copy
Snowflake
 SELECT
'"'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'"';
Copy
"'""'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"123"
Copy

INTEGER

Teradata
 SELECT '"'||cast(cast(12345 as INTEGER) as varchar(10))||'"';
Copy
(('"'||12345)||'"')|
-------------------+
"12345"            |

Copy
Snowflake
 SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'"';
Copy
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'""'"
------------------------------------------------------------------
"12345"

Copy

BIGINT

Teradata
 SELECT '"'||cast(cast(12345 as BIGINT) as varchar(10))||'"';
Copy
(('"'||12345)||'"')|
-------------------+
"12345"            |

Copy
Snowflake
 SELECT
       '"'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'"';
Copy
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"12345"

Copy

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))||'"';
Copy
(('"'||12345)||'"')|(('"'||12345)||'"')|
-------------------+-------------------+
"12345."           |"12345.00"         |

Copy
Snowflake
 SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL), 'TM.'), 10) ||'"',
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL(12, 2)), 'TM'), 10) ||'"';
Copy
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL), 'TM.'), 10) ||'"'	'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL(12, 2)), 'TM'), 10) ||'"'
"12345."	"12345.00"    
Copy

알려진 문제

  • 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;
Copy
COLUMN1          |COLUMN2
-----------------+--------------+
"-.10"           |".10"         |

Copy
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;
Copy
COLUMN1           |COLUMN2
------------------+---------------+
"-0.10"           |"0.10"         |

Copy

관련 EWIs

관련 EWIs 없음.

{ } 을 사용하여 DATE 로 형변환합니다.

설명

다음 구문은 중괄호 안에 문자열 정의 앞에 d를 넣어 날짜 형식의 문자열을 DATE 데이터 타입으로 형 변환합니다.

 SELECT {d '1233-10-10'}
Copy

샘플 소스 패턴

중괄호를 사용하여 DATE 로 형변환

Teradata

 SELECT * FROM RESOURCE_DETAILS where change_ts >= {d '2022-09-10'};
Copy

Snowflake

 SELECT
* FROM
PUBLIC.RESOURCE_DETAILS
where change_ts >= DATE('2022-09-10');
Copy

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;
Copy
VARCHAR_TO_INTERVAL | NUMBER_TO_INTERVAL | OUTSIDE_DATETIME_OPERATION |
--------------------+--------------------+----------------------------+
2022-10-15 23:04:56 |2017-10-15 10:30:00 | 7:00                       |

Copy
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;
Copy
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                      |

Copy

비리터럴 및 비구간 값

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;
Copy
DATETIME_OPERATION  | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-11-04 20:30:00 | 20 10                      |

Copy
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;
Copy
DATETIME_OPERATION      | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-11-04 20:30:00.000 | 20 10                      |

Copy

간격을 다른 간격으로 형 변환

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;
Copy
DATETIME_OPERATION  | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-10-19 13:30:00 | 4 03                       |

Copy
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;
Copy
DATETIME_OPERATION      | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-10-19 13:30:00.000 | 4 03                       |

Copy

Known Issues

알려진 문제 없음.

관련 EWIs

관련 EWIs 없음.

COALESCE

설명

Coalesce 함수는 목록에서 null이 아닌 첫 번째 요소를 반환하는 데 사용됩니다. 자세한 내용은 COALESCE 에서 확인할 수 있습니다.

COALESCE(element_1, element_2 [, element_3, ..., element_n])

Copy

Teradata 및 Snowflake COALESCE 함수 모두 숫자와 문자열, 날짜와 타임스탬프 매개 변수를 혼합할 수 있습니다. 그러나 이 두 가지 경우를 처리하는 방식은 다릅니다.

  • 문자열 매개 변수와 함께 숫자: Teradata는 모든 숫자 매개 변수를 varchar로 변환하는 반면, Snowflake는 그 반대의 작업을 수행합니다.

  • 날짜 매개 변수와 함께 타임스탬프: Teradata는 모든 타임스탬프를 날짜로 변환하는 반면, Snowflake는 그 반대의 작업을 수행합니다

첫 번째 경우 기능적 동등성을 보장하기 위해 모든 숫자 매개 변수는 to_varchar 함수를 사용하여 문자열 로 형 변환되며, 이는 숫자의 형식을 고려합니다. 두 번째 경우, 모든 타임스탬프는 to_date 를 사용하여 날짜로 형 변환되며, Teradata는 타임스탬프 형 변환 시 타임스탬프 형식을 무시하므로 변환 중에 제거됩니다.

샘플 소스 패턴

문자열 매개 변수와 혼합된 숫자

Teradata
  SELECT COALESCE(125, 'hello', cast(850 as format '-999'));
Copy
COLUMN1|
-------+
125    |

Copy
Snowflake
 SELECT
 COALESCE(TO_VARCHAR(125), 'hello', TO_VARCHAR(850, '9000'));
Copy
COLUMN1|
-------+
125    |

Copy

날짜 매개 변수와 혼합된 타임스탬프

Teradata
 SELECT COALESCE(cast(TIMESTAMP '2021-09-14 10:14:59' as format 'HH:MI:SSBDD-MM-YYYY'), current_date);
Copy
COLUMN1    |
-----------+
2021-09-14 |

Copy
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());
Copy
COLUMN1    |
-----------+
2021-09-14 |

Copy

Known Issues

알려진 문제 없음_._

관련 EWIs

CURRENT_TIMESTAMP

심각도

낮음

설명

분수 초는 TIME_OUTPUT_FORMAT 세션 매개 변수에서 명시적으로 설정된 경우에만 표시됩니다.

입력 코드:
 SELECT current_timestamp(4) at local;
Copy
출력 코드:
 SELECT
current_timestamp(4);
Copy

권장 사항

  • TIME_OUTPUT___FORMAT 세션 매개 변수가 원하는 동작을 얻도록 설정되어 있는지 확인합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@Snowflake.com으로 이메일을 보내주십시오.

알려진 문제

문제가 발견되지 않았습니다.

관련 EWIs

관련 EWIs 없음.

DAYNUMBER_OF_MONTH

설명

월 초부터 지정된 날짜까지 경과한 일수를 반환합니다. 자세한 내용은 DAYNUMBER_OF_MONTH 에서 확인할 수 있습니다.

DAYNUMBER_OF_MONTH(expression [, calendar_name])

Copy

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');
Copy
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22     |22     |22     |22     |

Copy
Snowflake
 SELECT
    DAYOFMONTH(DATE'2022-12-22'),
    DAYOFMONTH(DATE'2022-12-22'),
    DAYOFMONTH(DATE'2022-12-22'),
    DAYOFMONTH(DATE'2022-12-22');
Copy
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22     |22     |22     |22     |

Copy

ISO 달력

Teradata
 SELECT DAYNUMBER_OF_MONTH (DATE'2022-12-22', 'ISO');
Copy
COLUMN1|
-------+
25     |

Copy
Snowflake
 SELECT
PUBLIC.DAYNUMBER_OF_MONTH_UDF(DATE'2022-12-22');
Copy
COLUMN1|
-------+
25     |

Copy

알려진 문제

문제가 발견되지 않았습니다.

관련 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'
Copy
COLUMN1    | COLUMN2    | COLUMN3 |
-----------+------------+---------+
23067      |  Z\ESC     | 5A1B    |

Copy
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'
Copy
COLUMN1    | COLUMN2    | COLUMN3 |
-----------+------------+---------+
23067      |  Z\ESC     | 5A1B    |

Copy

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

Known Issues

  1. TO\NUMBER 형식 매개 변수는 입력 문자열의 자릿수와 일치해야 합니다.

  2. ANSI 로 인코딩할 때 FROM_BYTES 에 상응하는 기본 제공 함수가 없습니다

관련 EWIs

  1. SSC-EWI-0031: 지원되지 않는 함수

GETQUERYBANDVALUE

설명

GetQueryBandValue 함수는 쿼리 밴드 내에서 이름 키를 검색하고 이름 키가 있는 경우 관련 값을 반환합니다. 트랜잭션, 세션, 프로필 또는 쿼리 밴드의 키-값 페어 내부를 검색하는 데 사용할 수 있습니다.

이 함수에 대한 자세한 내용은 Teradata 설명서에서 GetQueryBandValue 섹션을 참조하십시오.

[SYSLIB.]GetQueryBandValue([QueryBandIn,] SearchType, Name);

Copy

샘플 소스 패턴

설정 데이터

Teradata
 SET QUERY_BAND = 'hola=hello;adios=bye;' FOR SESSION;
Copy
Snowflake
 ALTER SESSION SET QUERY_TAG = 'hola=hello;adios=bye;';
Copy

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;
Copy
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200  | Mark200  | SaraDB   | Peter3   | DbAdmin  |          |
+----------+----------+----------+----------+----------+----------+

Copy
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;
Copy
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200  | Mark200  | SaraDB   | Peter3   | DbAdmin  |          |
+----------+----------+----------+----------+----------+----------+

Copy

QueryBandIn 매개 변수 미사용 GetQueryBandValue

Teradata
 SELECT
GETQUERYBANDVALUE(2, 'hola') as Example1,
GETQUERYBANDVALUE(2, 'adios') as Example2;
Copy
+----------+----------+
| EXAMPLE1 | EXAMPLE2 |
+----------+----------+
| hello    | bye      |
+----------+----------+

Copy
Snowflake
 SELECT
GETQUERYBANDVALUE_UDF('hola') as Example1,
GETQUERYBANDVALUE_UDF('adios') as Example2;
Copy
+----------+----------+
| EXAMPLE1 | EXAMPLE2 |
+----------+----------+
| hello    | bye      |
+----------+----------+

Copy

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

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);
Copy

샘플 소스 패턴

기본 소스 패턴

Teradata
 SELECT JSON_CHECK('{"key": "value"}');
Copy
Snowflake Scripting
 SELECT
IFNULL(CHECK_JSON('{"key": "value"}'), 'OK');
Copy

CASE 변환 내의 JSON_CHECK

Teradata
 SELECT CASE WHEN JSON_CHECK('{}') = 'OK' then 'OKK' ELSE 'NOT OK' END;
Copy
Snowflake Scripting
 SELECT
CASE
WHEN IFNULL(CHECK_JSON('{}'), 'OK') = 'OK'
THEN 'OKK' ELSE 'NOT OK'
END;
Copy

알려진 문제

문제가 발견되지 않았습니다.

관련 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)
Copy

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;
Copy
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;
Copy

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

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"]
}
Copy

입력 문자열을 JSON 문서로 해석하여 VARIANT 값을 생성하는 Snowflake PARSE_JSON()를 사용합니다. 삽입된 JSON 은:

 { 
   "age": 31,
   "cities": ["Los Angeles", "Lima", "Buenos Aires"],
   "firstName": "Peter",
   "lastName": "Andre" 
}
Copy

이제 “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 [,...])]
)

Copy

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

패턴 코드 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);
Copy
ID | Song name  | Genre |
---+------------+-------+
1  | Late night | Jazz  |
---+------------+-------+
1  | Wake up    | Rock  |
---+------------+-------+
1  | Who am I   | Rock  |
---+------------+-------+
1  | Raining    | Blues |

Copy
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;
Copy
ID | Song name  | Genre |
---+------------+-------+
1  | Late night | Jazz  |
---+------------+-------+
1  | Wake up    | Rock  |
---+------------+-------+
1  | Who am I   | Rock  |
---+------------+-------+
1  | Raining    | Blues |

Copy

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 } ]

Copy

NEW JSON 함수의 두 번째 매개 변수는 Snowflake가 UTF-8에서만 작동하기 때문에 SnowConvert 에서는 항상 생략됩니다.

샘플 소스 패턴

문자열 데이터 포함 NEW JSON

Teradata
 SELECT NEW JSON ('{"name" : "cameron", "age" : 24}'),
NEW JSON ('{"name" : "cameron", "age" : 24}', LATIN);
Copy
COLUMN1                     | COLUMN2                     |
----------------------------+-----------------------------+
{"age":24,"name":"cameron"} | {"age":24,"name":"cameron"} |

Copy
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}'));
Copy
COLUMN1                     | COLUMN2                     |
----------------------------+-----------------------------+
{"age":24,"name":"cameron"} | {"age":24,"name":"cameron"} |

Copy

Known Issues

1. 두 번째 매개 변수는 지원되지 않습니다

결과 JSON 의 형식을 지정하는 데 사용되는 함수의 두 번째 매개 변수는 Snowflake가 UTF-8 만 지원하기 때문에 지원되지 않으며, 이로 인해 함수의 일부 용도에 따라 함수 차이가 발생할 수 있습니다.

2. BINARY 데이터를 포함한 JSON 은 지원되지 않습니다

Snowflake는 이진 데이터를 구문 분석하여 JSON 값을 생성하는 것을 지원하지 않으며, SnowConvert 가 이진 데이터로 작성된 NEW JSON 을 발견하면 사용자에게 경고가 표시됩니다.

관련 EWIs

  1. SSC-EWI-TD0039: 지원되지 않는 입력 형식입니다.

NVP

설명

키가 검색할 지정한 이름의 n번째 항목과 일치하는 키-값 페어의 값을 추출합니다. NVP 섹션을 참조하십시오.

[TD_SYSFNLIB.] NVP (
in_string,
name_to_search
[, name_delimiters ]
[, value_delimiters ]
[, occurrence ]
)

Copy

샘플 소스 패턴

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);
Copy
COLUMN1        | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world!  | Susana  |

Copy
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);
Copy
COLUMN1        | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world!  | Susana  |

Copy

선택적 매개 변수가 포함된 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', '#', '=');
Copy
COLUMN1 | COLUMN2 | COLUMN3     |
--------+---------+-------------+
Green   | Blue    | Los Angeles |

Copy
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);
Copy
COLUMN1 | COLUMN2 | COLUMN3     |
--------+---------+-------------+
Green   | Blue    | Los Angeles |

Copy

구분 기호에 공백이 있는 NVP

Teradata
 SELECT
NVP('store = whole foods&&store: ?Bristol farms','store', '&&', '\ =\  :\ ?', 2),
NVP('Hello = bye|name = Lucas|Hello = world!', 'Hello', '|', '\ =\ ', 2);
Copy
COLUMN1       | COLUMN2 |
--------------+---------+
Bristol farms | world!  |

Copy
Snowflake
 SELECT
PUBLIC.NVP_UDF('store = whole foods&&store: ?Bristol farms', 'store', '&&', '\\ =\\  :\\ ?', 2),
PUBLIC.NVP_UDF('Hello = bye|name = Lucas|Hello = world!', 'Hello', '|', '\\ =\\ ', 2);
Copy
 COLUMN1       | COLUMN2 |
--------------+---------+
Bristol farms | world!  |
Copy

리터럴이 아닌 구분 기호가 있는 NVP

Teradata
 SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
Copy
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 ***/;
Copy

Known Issues

1. 공백()이 있는 구분 기호는 Snowflake에서 백슬래시를 스케이프해야 합니다

Teradata에서는 공백을 포함한 구분 기호는 “\ “를 사용하여 지정합니다(구분 기호에 공백이 포함된 NVP 참조). 예제에서 볼 수 있듯이 Teradata에서는 백슬래시를 이스케이프 처리할 필요가 없지만, Snowflake에서는 이스케이프 처리가 필요합니다. 구분 기호에서 백슬래시 이스케이프는 SnowConvert 에서 자동으로 수행할 수 있지만 구분 기호 값이 리터럴 문자열인 경우에만 가능하며, 그렇지 않은 경우 사용자에게 백슬래시를 이스케이프할 수 없으며 Snowflake에서 다른 결과가 발생할 수 있다는 경고가 표시됩니다.

관련 EWIs

  1. SSC-FDM-TD0008: 공백이 있는 리터럴이 아닌 구분 기호는 백슬래시를 Snowflake로 이스케이프해야 합니다.

OVERLAPS

설명

Teradata의 설명서에 따르면 OVERLAPS 연산자는 2개 이상의 기간 식을 비교합니다. 겹치면 true을 반환합니다.

Teradata의 OVERLAPS 에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.

 period_expression
OVERLAPS
period_expression
Copy

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');
Copy

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 ***/!!!;
Copy

Known Issues

1. Unsupported Period Expressions

PERIOD(TIME WITH TIME ZONE)PERIOD(TIMESTAMP WITH TIME ZONE) 식은 아직 지원되지 않습니다.

관련 EWIs

  1. SSC-EWI-TD0053: Snowflake는 기간 데이터 타입을 지원하지 않으며, 대신 모든 기간이 varchar로 처리됩니다.

P_INTERSECT

설명

Teradata 설명서에 따르면, P_INTERSECT 연산자는 2개 이상의 기간 식을 비교합니다. 중첩되는 경우 기간 식의 공통 부분을 반환합니다.

Teradata의 P_INTERSECT 에 대한 자세한 내용은 여기를 클릭하십시오.

 period_expression
P_INTERSECT
period_expression
Copy

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');
Copy

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 ***/!!!;
Copy

Known Issues

1. Unsupported Period Expressions

PERIOD(TIME WITH TIME ZONE)PERIOD(TIMESTAMP WITH TIME ZONE) 식은 아직 지원되지 않습니다.

관련 EWIs

  1. 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

Copy

샘플 소스 패턴

설정 데이터

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);
Copy
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);
Copy

기본 PIVOT 변환

Teradata
 SELECT *
FROM star1 PIVOT (
	SUM(sales) FOR qtr                                                                                               
    IN ('Q1',                                                                                                     
    	'Q2', 
        'Q3')
)Tmp;
Copy
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 |
--------+-------+------+------+------+------+------+

Copy
Snowflake
 SELECT
	*
FROM
	star1 PIVOT(
	SUM(sales) FOR qtr IN ('Q1',
	   	'Q2',
	       'Q3'))Tmp;
Copy
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 |
--------+-------+------+------+------+------+------+

Copy

별칭 변환을 사용한 PIVOT

Teradata
 SELECT *
FROM star1 PIVOT (
	SUM(sales) as ss1 FOR qtr                                                                                               
    IN ('Q1' AS Quarter1,                                                                                                     
    	'Q2' AS Quarter2, 
        'Q3' AS Quarter3)
)Tmp;
Copy
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         |
--------+-------+------+------+--------------+--------------+--------------+

Copy
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;
Copy
 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         |
--------+-------+------+------+--------------+--------------+--------------+
Copy

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

  1. SSC-EWI-0015: 입력 피벗/피벗 해제 문 양식은 지원되지 않습니다

RANK

설명

RANK 는 결과 세트를 정렬하고 결과에서 각 행의 숫자 순위를 식별합니다. RANK 의 유일한 인자는 정렬 열(또는 열)이며 함수는 결과에서 각 행의 순위를 나타내는 정수를 반환합니다. (Teradata의 RANK )

Teradata 구문

 RANK ( sort_expression [ ASC | DESC ] [,...] )
Copy

Snowflake 구문

 RANK() OVER 
( 
    [ PARTITION BY <expr1> ]
    ORDER BY <expr2> [ { ASC | DESC } ] 
    [ <window_frame> ]
)
Copy

샘플 소스 패턴

설정 데이터

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);
Copy
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);
Copy

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;
Copy
SALESSALESASCSALESDESCSALESDEFAULT
NULL666
200511
150322
150322
120244
100155
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;
Copy
SALESSALESASCSALESDESCSALESDEFAULT
NULL666
200511
150322
150322
120244
100155

알려진 문제

문제가 발견되지 않았습니다.

관련 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)

Copy

샘플 소스 패턴

설정 데이터

Teradata
 CREATE TABLE regexpTable
(
    col1 CHAR(35)
);

INSERT INTO regexpTable VALUES('hola');
Copy
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');
Copy

정규식 변환 예제

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;
Copy
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala   |null   |1      |0      |

Copy
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;
Copy
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala   |null   |1      |FALSE  |

Copy

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

  1. SSC-FDM-0007: 종속성이 누락된 요소.

  2. 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 )

Copy

샘플 소스 패턴

설정 데이터

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');
Copy
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');
Copy

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;
Copy
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      |

Copy
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;
Copy
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      |

Copy

Known Issues

알려진 문제 없음.

관련 EWIs

관련 EWIs 없음.

SUBSTRING

설명

지정된 입력 문자열에서 하위 문자열을 추출합니다. 자세한 내용은 SUBSTRING/SUBSTR.에서 확인할 수 있습니다.

SUBSTRING(string_expr FROM n1 [FOR n2])

SUBSTR(string_expr, n1, [, n2])

Copy

하위 문자열 (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);
Copy
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W  |Hel     |ello W  |Hel      |

Copy
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);
Copy
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W  |Hel     |ello W  |Hel      |

Copy

관련 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' } )
  ]
)

Copy

다음 변환은 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);
Copy
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);
Copy

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;
Copy
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  |


Copy
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;
Copy
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  |

Copy

Known Issues

  1. INCLUDE_NULLS 이 YES 로 설정된 TD_UNPIVOT 절은 지원되지 않습니다

    변환에 사용되는 Snowflake UNPIVOT 함수는 항상 null 값을 무시하며, INCLUDE_NULLS 이 YES 로 설정된 절의 경우 사용자에게 지원되지 않는다는 경고가 표시됩니다.

  2. 함수를 올바르게 변환하려면 테이블 정보가 필요합니다

    SnowConvert 에는 TD_UNPIVOT 함수에서 사용 중인 열의 이름이 필요합니다. 사용자가 함수의 query_expression에 열 목록을 포함하지 않고 피벗 해제 중인 테이블의 이름을 제공하면 테이블 정의에서 열 이름을 검색하려고 시도합니다. 이름을 찾을 수 없는 경우 사용자에게 쿼리 결과에서 열이 손실될 수 있다는 경고가 표시됩니다.

관련 EWIs

  1. 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])

Copy

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');
Copy
COLUMN1    | COLUMN2    | COLUMN3           |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |

Copy
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 ***/;
Copy
COLUMN1    | COLUMN2    | COLUMN3           |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |

Copy

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''');
Copy
COLUMN1  | COLUMN2 | COLUMN3       |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |

Copy
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 ***/;
Copy
COLUMN1  | COLUMN2 | COLUMN3       |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |

Copy

Known Issues

1. 동작이 다르거나 지원되지 않는 형식

Teradata는 TO_CHAR 함수를 변환한 후 Snowflake에서 다른 동작을 보일 수 있는 광범위한 형식 요소 목록을 제공합니다. 동작이 다르거나 지원되지 않는 요소 목록은 SSC-EWI-TD0029를 참조하십시오.

관련 EWIs

  1. 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 } ]

Copy

샘플 소스 패턴

설정 데이터

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);
Copy
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);
Copy

XMLAGG 변환

Teradata
 select 
    xmlagg(o_orderkey order by o_totalprice desc) (varchar(10000))
from orders
where o_totalprice > 5;
Copy
COLUMN1 |
--------+
4 3 1 2 |

Copy
Snowflake
 SELECT
    LEFT(TO_VARCHAR(LISTAGG ( o_orderkey, ' ')
    WITHIN GROUP(
 order by o_totalprice DESC NULLS LAST)), 10000)
    from
    orders
    where o_totalprice > 5;
Copy
COLUMN1 |
--------+
4 3 1 2 |

Copy

Known Issues

1. RETURNING 절은 현재 지원되지 않습니다.

사용자에게 반환 절의 변환이 향후 추가될 것이라는 경고가 표시됩니다.

관련 EWIs

관련 EWIs 없음.