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, '日曜日')

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(Numeric)

ROUND

ROUND(Date)

ROUND_DATE_UDF

TRUNC(Date)

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

正規表現関数をチェックしてください

正規表現関数 を参照してください

文字列演算子と関数

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

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

このセクションには、Teradataのシステム組み込み関数としては提供されていないが、 SnowConvert によって変換される UDFs およびその他の拡張関数が含まれています

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 関数の移行中に、終了境界が存在するかどうかがチェックされ、それがこれらの定数の1つであるかどうかが判断され、その場合は値「9999-12-31 23:59:59.999999」のvarcharに置き換えられます。その後、Snowflakeは、 PERIOD___UDF を呼び出すときに、開始境界のタイプに応じてvarcharを日付またはタイムスタンプにキャストします。

暗黙的な変換

INDEX や POSITION のようなTeradataの文字列関数の中には、文字列以外のデータ型を受け入れ、暗黙的に文字列に変換するものがあります。このため、TeradataとSnowflakeの間でこれらの関数の結果に矛盾が生じることがあります。例えば、以下のTeradataコードです。

 SELECT INDEX(35, '5');
Copy

4を返しますが、Snowflakeでは CHARINDEX に相当するものは以下のようになります。

 SELECT CHARINDEX('5', 35);
Copy

2を返します。これはTeradataが暗黙的な変換時に使用する独自の デフォルト形式 を持っているために起こります。上記の例では、Teradataは数値定数 35を BYTEINT と解釈し、文字列への暗黙の変換に BYTEINT デフォルト形式 '-999' を使用するため、変換後の値は ' 35' となります。一方、Snowflakeは独自の デフォルト形式 を使用するため、結果に矛盾が生じます。

これを解決するために、これらの関数のパラメーターに以下の変更を加えます。

  • パラメータに形式を持つキャストが ない 場合は、代わりに、SnowflakeのデフォルトのTeradata形式に相当するSnowflake TO_VARCHAR 関数が追加されます。

  • パラメーターが形式を持つキャストを持つ場合、その形式はSnowflakeの同等の形式に変換され、 TO_VARCHAR 関数が追加されます。

    • 余談ですが、Teradataは明示的に形式内に数値の符号を入れなければ無視しますが、Snowflakeは指定されていなくても常に空白を追加して符号を挿入するため、そのような場合は符号が指定されているかどうかをチェックし、指定されていない場合はSnowflakeの文字列から符号を削除します。

これらの変更後のコードは次のようになります。

 SELECT CHARINDEX( '5', TO_VARCHAR(35, 'MI999'));
Copy

これはTeradataのコードと同じ4を返します。

既知の問題

問題は見つかりませんでした。

Numberデータ型からVarcharデータ型へのキャスト

Teradataがvarcharにキャストする際、各数値データ型のデフォルト形式を使用するため、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はドットの前にゼロを追加しませんが、Snowflakeは追加します。

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 が生成されます

  • 値がリテラルである場合、キャストがdatetime操作で使用される場合は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

既知の問題

既知の問題はありません。

関連 EWIs

関連 EWIs はありません。

COALESCE

説明

Coalesce関数は、リストの最初の非null要素を返すために使われます。詳細は COALESCE を参照してください。

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

Copy

TeradataとSnowflakeの COALESCE 関数は、数値と文字列、日付とタイムスタンプのパラメーターを混在させることができます。ただし、これら2つのケースは異なる方法で処理されます。

  • 数値と文字列パラメーター: Teradataはすべての数値パラメーターをvarcharに変換しますが、Snowflakeはその逆を行います

  • タイムスタンプと日付パラメーター: Teradataはすべてのタイムスタンプを日付に変換しますが、Snowflakeはその逆を行います

最初のケースで機能的等価性を保証するために、すべての数値パラメーターは to_varchar 関数を使用して 文字列 にキャストされ、これにより数値の形式が考慮されます。2つ目のケースでは、すべてのタイムスタンプは 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

既知の問題

既知の問題はありません_._

関連 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 関数を同じように扱いますが、ある1つのケースを除きます。

  • 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 (エンコード) をご参照ください。

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

注釈

わかりやすくするため、出力コードの一部を省略しています。

既知の問題

  1. TO_NUMBER 形式パラメーターは入力文字列の桁数と一致する必要があります。

  2. ANSI にエンコードするとき、FROM_BYTES と機能的に等価な組み込み関数はありません

関連 EWIs

  1. SSC-EWI-0031: FUNCTION NOT SUPPORTED

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

注釈

わかりやすくするため、出力コードの一部を省略しています。

既知の問題

1.QueryBandIn パラメーターなしの GetQueryBandValue はセッションでのみサポートされます

Teradataでは、トランザクション、セッション、プロファイルレベルでクエリバンドを定義することができます。入力クエリバンドを指定せずに GetQueryBandValue を呼び出した場合、Teradataは SearchType パラメーターの値に応じて、トランザクション、セッション、またはプロファイルのクエリバンドを自動的にチェックします。

Snowflakeでは、クエリバンドに最も近いものはクエリタグで、セッション、ユーザー、アカウントに対して指定することができます。

これらの違いにより、QueryBandIn パラメーターなしの GetQueryBandValue の実装はセッションクエリタグのみを考慮し、他の検索タイプでは期待通りに動作しない可能性があります。

関連 EWIs

関連 EWIs はありません。

JSON_CHECK

説明

JSON_CHECK 関数は、文字列が有効な JSON であるかどうかをチェックします。

Teradata JSON_CHECK の詳細については、 こちら をご参照ください。

 [TD_SYSFNLIB.]JSON_CHECK(string_expr);
Copy

サンプルソースパターン

基本ソースパターン

Teradata
 SELECT JSON_CHECK('{"key": "value"}');
Copy
Snowflakeスクリプト
 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スクリプト
 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スクリプト
 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

注釈

わかりやすくするため、出力コードの一部を省略しています。

既知の問題

1.JSONs 内の要素は、元の順序を保持しない場合があります。

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」が最初の要素になっていることに注目してください。しかし、「都市」の配列は元の順序を維持しています。

関連 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では、生成された列が2番目の列を置き換えるため、JSON_TABLE の2番目の列は 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

既知の問題

1.COLEXPR の JSON パスは複数のアスタリスクアクセスを持つことはできません

列 JSON パスは、アスタリスクアクセスで複数のリストを持つことはできません。例: $.Names[*].FullNames[*]。一方、ROWEXP の JSON パスは持つことができます。

2.COLEXPR リテラルで定義された JSON 構造は、有効な 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

Snowflakeは UTF-8でのみ動作するため、NEW JSON 関数の2番目のパラメーターは、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

既知の問題

1.2番目のパラメーターはサポートされていません

Snowflakeは UTF-8のみをサポートしているため、結果の JSON の形式を指定するために使用される関数の2番目のパラメーターはサポートされていません。このため、関数の一部の使用において機能上の違いが生じる可能性があります。

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

既知の問題

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スクリプト

 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

既知の問題

1.サポートされていない期間式

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スクリプト

 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

既知の問題

1.サポートされていない期間式

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

既知の問題

1.WITH 句はサポートされていません

WITH 句の使用は現在サポートされていません。

2.複数のピボット列でのピボットはサポートされていません

Snowconvertは PIVOT 関数をSnowflakeの PIVOT 関数に変換しています。Snowflakeは関数を単一の列に対してのみ適用することをサポートしています。

3.複数の集計関数によるピボットはサポートされていません

Snowflakeの PIVOT 関数は、データに対して1つの集計関数の適用しかサポートしていません。

4.IN 句のサブクエリはサポートされていません

Snowflake PIVOT 関数の IN 句はサブクエリを受け付けません。

5.エイリアスは、すべての IN 句要素にエイリアスがあり、テーブル指定が存在する場合にのみサポートされます

エイリアスを持つ列名が等価であるためには、 SnowConvert は、IN 句で指定されたすべての値に1つのエイリアスが指定されていて、入力コードにテーブル指定が存在することを必要とします。これは、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

既知の問題

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

既知の問題

既知の問題はありません。

関連 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

注釈

わかりやすくするため、出力コードの一部を省略しています。

説明

Teradataの TD_UNPIVOT は複数の列を一度にアンピボットできますが、Snowflake UNPIVOT は1つの列のみをアンピボットできます。アンピボット 機能は、指定したテーブルの列を行に変換するために使用されます。詳細は、 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で動作するのと同じように、Snowflakeで複数の列を同時にアンピボットする SQL クエリを生成することができます。

サンプルソースパターン

データタイトルのセットアップ

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

既知の問題

  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

既知の問題

1.動作が異なる、またはサポートされていない形式

Teradataは、 TO_CHAR 関数の変換後にSnowflakeで異なる動作を示す可能性のある形式要素の広範なリストを提供しています。動作が異なる、あるいはサポートされていない要素のリストについては SSC-EWI-TD0029を参照してください。

関連 EWIs

  1. SSC-FDM-TD0029: Snowflakeがサポートする TO_CHAR の形式が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

既知の問題

1.RETURNING 句は現在サポートされていません。

ユーザーには、返り句の翻訳が将来追加されることが警告されます。

関連 EWIs

関連 EWIs はありません。