SnowConvert AI - Teradata - 組み込み関数¶
このページでは、Teradataの組み込み関数のSnowflakeへの翻訳について説明します。
注釈
このページでは、SnowConvert AI で既に変換されている関数のみをリストアップしています。Teradataドキュメントの関数が記載されていない場合は、サポートされていないものとお考えください。
組み込み関数とそれに相当するSnowflake関数の詳細については、 共通組み込み関数 もご参照ください。
注釈
一部のTeradata関数は、Snowflakeに直接同等なものがないため、機能的に同等な UDF に変換されます。これらは、関数名の _UDF という接尾辞で簡単に見つけることができます。UDFs SnowConvert AI の使用に関する詳細については、こちらの gitリポジトリ をご確認ください。
集計関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
AVG |
AVG |
|
CORR |
CORR |
|
COUNT |
COUNT |
|
COVAR_POP |
COVAR_POP |
|
COVAR_SAMP |
COVAR_SAMP |
|
GROUPING |
GROUPING |
|
KURTOSIS |
KURTOSIS |
|
MAXIMUM MAX |
MAX |
|
MINIMUM MIN |
MIN |
|
PIVOT |
PIVOT |
PIVOTをチェックしてください。 |
REGR_AVGX |
REGR_AVGX |
|
REGR_AVGY |
REGR_AVGY |
|
REGR_COUNT |
REGR_COUNT |
|
REGR_INTERCEPT |
REGR_INTERCEPT |
|
REGR_R2 |
REGR_R2 |
|
REGR_SLOPE |
REGR_SLOPE |
|
REGR_SXX |
REGR_SXX |
|
REGR_SXY |
REGR_SXY |
|
REGR_SYY |
REGR_SYY |
|
SKEW |
SKEW |
|
STDDEV_POP |
STDDEV_POP |
|
STDDEV_SAMP |
STDDEV_SAMP |
|
SUM |
SUM |
|
UNPIVOT |
UNPIVOT |
<p>複数関数によるピボット解除<br>はSnowflakeではサポートされていません</p> |
VAR_POP |
VAR_POP |
|
VAR_SAMP |
VAR_SAMP |
集計関数を参照してください
算術、三角、双曲線演算子/関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
ABS |
ABS |
|
CEILING |
CEIL |
|
DEGREES |
DEGREES |
|
EXP |
EXP |
|
FLOOR |
FLOOR |
|
HYPERBOLIC ACOSH ASINH ATANH COSH SINH TANH |
HYPERBOLIC ACOSH ASINH ATANH COSH SINH TANH |
|
LOG |
LOG |
|
LN |
LN |
|
MOD |
MOD |
|
NULLIFZERO(param) |
CASE WHEN param=0 THEN null ELSE param END |
|
POWER |
POWER |
|
RANDOM |
RANDOM |
|
RADIANS |
RADIANS |
|
ROUND |
ROUND |
|
SIGN |
SIGN |
|
SQRT |
SQRT |
|
TRUNC |
TRUNC_UDF |
|
TRIGONOMETRIC ACOS ASIN ATAN ATAN2 COS SIN TAN |
TRIGONOMETRIC ACOS ASIN ATAN ATAN2 COS SIN TAN |
|
ZEROIFNULL |
ZEROIFNULL |
算術、三角、双曲線演算子/関数 を参照してください
属性関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
BIT_LENGTH |
BIT_LENGTH |
|
BYTE BYTES |
LENGTH |
|
CHAR CHARS CHARACTERS |
LEN |
|
CHAR_LENGTH CHARACTER_LENGTH |
LEN |
|
MCHARACTERS |
LENGTH |
|
OCTECT_LENGTH |
OCTECT_LENGTH |
属性関数 を参照してください
ビット/バイト操作関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
BITAND |
BITAND |
|
BITNOT |
BITNOT |
|
BITOR |
BITOR |
|
BITXOR |
BITXOR |
|
GETBIT |
GETBIT |
ビット/バイト関数 を参照してください
組み込み(システム関数)¶
Teradata |
Snowflake |
注意 |
|---|---|---|
ACCOUNT |
CURRENT_ACCOUNT |
|
CURRENT_DATE CURDATE |
CURRENT_DATE |
|
CURRENT_ROLE |
CURRENT_ROLE |
|
CURRENT_TIME |
CURRENT_TIME |
|
CURRENT_TIMESTAMP |
CURRENT_TIMESTAMP |
|
DATABASE |
CURRENT_DATABASE |
|
DATE |
CURRENT_DATE |
|
NOW |
CURRENT_TIMESTAMP |
|
PROFILE |
CURRENT_ROLE |
この変換の詳細については、 SSC-EWI-TD0068 をチェックしてください |
SESSION |
CURRENT_SESSION |
|
TIME |
CURRENT_TIME |
|
USER |
CURRENT_USER |
組み込み関数 を参照してください
ビジネスカレンダー¶
Teradata |
Snowflake |
注意 |
|---|---|---|
DAYNUMBER_OF_MONTH(DatetimeValue, 'COMPATIBLE') |
DAYOFMONTH |
|
DAYNUMBER_OF_MONTH(DatetimeValue, 'ISO') |
DAYNUMBER_OF_MONTH_ISO_UDF |
|
DAYNUMBER_OF_MONTH(DatetimeValue, 'TERADATA') |
DAYOFMONTH |
|
DAYNUMBER_OF_WEEK(DatetimeValue, 'ISO') |
DAYOFWEEKISO |
|
DAYNUMBER_OF_WEEK(DatetimeValue, 'COMPATIBLE') |
DAY_OF_WEEK_COMPATIBLE_UDF |
|
DAYNUMBER_OF_WEEK(DatetimeValue, 'TERADATA') |
TD_DAY_OF_WEEK_UDF |
|
DAYNUMBER_OF_YEAR(DatetimeValue, 'ISO') |
PUBLIC.DAY_OF_YEAR_ISO_UDF |
|
DAYNUMBER_OF_YEAR(DatetimeValue) |
DAYOFYEAR |
|
QUARTERNUMBER_OF_YEAR |
QUARTER |
|
TD_SUNDAY(DateTimeValue) |
PREVIOUS_DAY(DateTimeValue, '日曜日') |
|
WEEKNUMBER_OF_MONTH |
WEEKNUMBER_OF_MONTH_UDF |
|
WEEKNUMBER_OF_QUARTER(dateTimeValue) |
WEEKNUMBER_OF_QUARTER_UDF |
|
WEEKNUMBER_OF_QUARTER(dateTimeValue, 'ISO') |
WEEKNUMBER_OF_QUARTER_ISO_UDF |
|
WEEKNUMBER_OF_QUARTER(dateTimeValue, 'COMPATIBLE') |
WEEKNUMBER_OF_QUARTER_COMPATIBLE_UDF |
|
WEEKNUMBER_OF_YEAR(DateTimeValue, 'ISO') |
WEEKISO |
|
YEARNUMBER_OF_CALENDAR(DATETIMEVALUE, 'COMPATIBLE') |
YEAR |
|
YEARNUMBER_OF_CALENDAR(DATETIMEVALUE, 'ISO') |
YEAROFWEEKISO |
ビジネスカレンダー を参照してください
カレンダー関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
DAYNUMBER_OF_WEEK(DatetimeValue) |
TD_DAY_OF_WEEK_UDF |
|
DAYNUMBER_OF_WEEK(DatetimeValue, 'COMPATIBLE') |
DAY_OF_WEEK_COMPATIBLE_UDF |
|
QuarterNumber_Of_Year(DatetimeValue, 'ISO') |
QUARTER_OF_YEAR_ISO_UDF(DatetimeValue) |
|
TD_DAY_OF_CALENDAR |
TD_DAY_OF_CALENDAR_UDF |
|
TD_DAY_OF_MONTH |
DAYOFMONTH |
|
TD_DAY_OF_WEEK |
TD_DAY_OF_WEEK_UDF |
|
TD_DAY_OF_YEAR |
DAYOFYEAR |
|
TD_MONTH_OF_CALENDAR(DateTimeValue) |
TD_MONTH_OF_CALENDAR_UDF(DateTimeValue) |
|
TD_WEEK_OF_CALENDAR(DateTimeValue) |
TD_WEEK_OF_CALENDAR_UDF(DateTimeValue) |
|
TD_WEEK_OF_YEAR |
WEEK_OF_YEAR_UDF |
|
TD_YEAR_BEGIN(DateTimeValue) |
YEAR_BEGIN_UDF(DateTimeValue) |
|
TD_YEAR_BEGIN(DateTimeValue, 'ISO') |
YEAR_BEGIN_ISO_UDF(DateTimeValue) |
|
TD_YEAR_END(DateTimeValue) |
YEAR_END_UDF(DateTimeValue) |
|
TD_YEAR_END(DateTimeValue, 'ISO') |
YEAR_END_ISO_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_MONTH(DateTimeValue) |
WEEKNUMBER_OF_MONTH_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_QUARTER(DateTimeValue) |
WEEKNUMBER_OF_QUARTER_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_QUARTER(DateTimeValue, 'ISO') |
WEEKNUMBER_OF_QUARTER_ISO_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_QUARTER(DateTimeValue, 'COMPATIBLE') |
WEEKNUMBER_OF_QUARTER_COMPATIBLE_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_YEAR(DateTimeValue) |
WEEK_OF_YEAR_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_YEAR(DateTimeValue, 'COMPATIBLE') |
WEEK_OF_YEAR_COMPATIBLE_UDF(DateTimeValue) |
カレンダー関数 を参照してください
ケース関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
COALESCE |
COALESCE |
Coalesceをチェックしてください。 |
NULLIF |
NULLIF |
ケース関数 を参照してください
比較関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
DECODE |
DECODE |
|
GREATEST |
GREATEST |
|
LEAST |
LEAST |
比較関数 を参照してください
データ型の変換¶
Teradata |
Snowflake |
注意 |
|---|---|---|
CAST |
CAST |
|
CAST(DatetimeValue AS INT) |
DATE_TO_INT_UDF |
|
CAST (VarcharValue AS INTERVAL) |
INTERVAL_UDF |
INTERVAL データ型にキャストをチェックしてください |
TRYCAST |
TRY_CAST |
|
FROM_BYTES |
TO_NUMBER |
ASCII パラメーターを含む FROM_BYTESはSnowflakeではサポートされていません。 |
データ型変換 をご参照ください
データ型変換関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
TO_BYTES(Input, 'Base10') |
INT2HEX_UDF(Input) |
|
TO_NUMBER |
TO_NUMBER |
|
TO_CHAR |
TO_CHAR または同等の式 |
TO_CHARをチェックしてください。 |
TO_DATE |
TO_DATE |
|
TO_DATE(input, 'YYYYDDD') |
JULIAN_TO_DATE_UDF |
データ型変換関数 を参照してください
DateTime および間隔関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
ADD_MONTHS |
ADD_MONTHS |
|
EXTRACT |
EXTRACT |
|
LAST_DAY |
LAST_DAY |
|
MONTH |
MONTH |
|
MONTHS_BETWEEN |
MONTHS_BETWEEN_UDF |
|
NEXT_DAY |
NEXT_DAY |
|
OADD_MONTHS |
ADD_MONTHS |
|
ROUND(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 |
JSON_EXTRACT_UDF |
JSON_EXTRACTをチェックしてください |
JSON ドキュメント を参照してください
Nullハンドリング関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
NVL |
NVL |
|
NVL2 |
NVL2 |
Nullハンドリング関数 を参照してください
順序分析/ウィンドウ集計関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
CSUM(col1, col2) |
SUM(col_1) OVER (PARTITION BY null ORDER BY col_2 ROWS UNBOUNDED PRECEDING) |
|
CUME_DIST |
CUME_DIST |
|
DENSE_RANK |
DENSE_RANK |
|
FIRST_VALUE |
FIRST_VALUE |
|
LAG |
LAG |
|
LAST_VALUE |
LAST_VALUE |
|
LEAD |
LEAD |
|
MAVG(csales, 2, cdate, csales) |
AVG(csales) OVER ( ORDER BY cdate, csales ROWS 1 PRECEDING) |
|
MEDIAN |
MEDIAN |
|
MSUM(csales, 2, cdate, csales) |
SUM(csales) OVER(ORDER BY cdate, csales ROWS 1 PRECEDING) |
|
PERCENT_RANK |
PERCENT_RANK |
|
PERCENTILE_CONT |
PERCENTILE_CONT |
|
PERCENTILE_DISC |
PERCENTILE_DISC |
|
QUANTILE |
QUANTILE |
|
RANK |
RANK |
|
ROW_NUMBER |
ROW_NUMBER |
ウィンドウ関数 を参照してください
期間関数と演算子¶
Teradata |
Snowflake |
注意 |
|---|---|---|
BEGIN |
PERIOD_BEGIN_UDF |
|
END |
PERIOD_END_UDF |
|
INTERVAL |
TIMESTAMPDIFF |
|
LAST |
PERIOD_LAST_UDF |
|
LDIFF |
PERIOD_LDIFF_UDF |
|
OVERLAPS |
PUBLIC.PERIOD_OVERLAPS_UDF |
|
PERIOD |
PERIOD_UDF |
|
PERIOD(datetimeValue, UNTIL_CHANGED) |
PERIOD_UDF(datetimeValue, '9999-12-31 23:59:59.999999') |
終了境界定数 に関するメモをご参照ください |
RDIFF |
PERIOD_RDIFF_UDF |
期間関数と演算子 を参照してください
クエリバンド関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
GETQUERYBANDVALUE |
GETQUERYBANDVALUE_UDF |
GETQUERYBANDVALUEをチェックしてください |
クエリバンド関数 を参照してください
正規表現関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
REGEXP_INSTR |
REGEXP_INSTR |
正規表現関数をチェックしてください |
REGEXP_REPLACE |
REGEXP_REPLACE |
正規表現関数をチェックしてください |
REGEXP_SIMILAR |
REGEXP_LIKE |
正規表現関数をチェックしてください |
REGEXP_SUBSTR |
REGEXP_SUBSTR |
正規表現関数をチェックしてください |
正規表現関数 を参照してください
文字列演算子と関数¶
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_Point関数 をご参照ください
テーブル演算子¶
Teradata |
Snowflake |
注意 |
|---|---|---|
TD_UNPIVOT |
同等のクエリ |
Td_unpivot をチェックしてください |
テーブル演算子 を参照してください
XML 関数¶
Teradata |
Snowflake |
注意 |
|---|---|---|
XMLAGG |
LISTAGG |
Xmlaggをチェックしてください |
XMLQUERY |
サポート対象外 |
XML 関数 を参照してください
拡張性 UDFs¶
このセクションには、Teradataのシステム組み込み関数としては提供されていないが SnowConvert AI で変換されている 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');
4を返しますが、Snowflakeでは CHARINDEX に相当するものは以下のようになります。
SELECT CHARINDEX('5', 35);
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'));
これはTeradataのコードと同じ4を返します。
既知の問題¶
問題は見つかりませんでした。
COALESCE¶
説明¶
Coalesce関数は、リストの最初の非null要素を返すために使われます。詳細は COALESCE を参照してください。
COALESCE(element_1, element_2 [, element_3, ..., element_n])
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'));
結果
COLUMN1|
-------+
125 |
Snowflake¶
クエリ
SELECT
COALESCE(TO_VARCHAR(125), 'hello', TO_VARCHAR(850, '9000'));
結果
COLUMN1|
-------+
125 |
タイムスタンプと日付パラメーターの混在¶
Teradata¶
クエリ
SELECT COALESCE(cast(TIMESTAMP '2021-09-14 10:14:59' as format 'HH:MI:SSBDD-MM-YYYY'), current_date);
結果
COLUMN1 |
-----------+
2021-09-14 |
Snowflake¶
クエリ
SELECT
COALESCE(TO_DATE(TIMESTAMP '2021-09-14 10:14:59' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'HH:MI:SSBDD-MM-YYYY' NOT SUPPORTED. ***/!!!), CURRENT_DATE());
結果
COLUMN1 |
-----------+
2021-09-14 |
既知の問題¶
既知の問題はありません_._
関連 EWIs¶
SSC-EWI-TD0025:出力形式がサポートされていません。
CURRENT_TIMESTAMP¶
重大性¶
低
説明¶
秒の小数部は、TIME_OUTPUT_FORMAT セッションパラメーターで明示的にセットされた場合のみ表示されます。
入力コード:¶
SELECT current_timestamp(4) at local;
出力コード:¶
SELECT
CURRENT_TIMESTAMP(4);
推奨事項¶
TIME_OUTPUT___FORMAT セッションパラメーターがセットされているか確認し、希望する動作を得ます。
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
既知の問題¶
問題は見つかりませんでした。
関連 EWIs ¶
関連 EWIs はありません。
DAYNUMBER_OF_MONTH¶
説明¶
月初日から指定した日までの経過日数を返します。詳細は DAYNUMBER_OF_MONTH をご参照ください。
DAYNUMBER_OF_MONTH(expression [, calendar_name])
TeradataもSnowflakeも、DAYNUMBER_OF_MONTH 関数を同じように扱いますが、ある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');
結果
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22 |22 |22 |22 |
Snowflake¶
クエリ
SELECT
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22');
結果
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22 |22 |22 |22 |
ISO カレンダー¶
Teradata¶
クエリ
SELECT DAYNUMBER_OF_MONTH (DATE'2022-12-22', 'ISO');
結果
COLUMN1|
-------+
25 |
Snowflake¶
クエリ
SELECT
PUBLIC.DAYNUMBER_OF_MONTH_UDF(DATE'2022-12-22');
結果
COLUMN1|
-------+
25 |
既知の問題¶
問題は見つかりませんでした。
関連 EWIs ¶
関連 EWIs はありません。
FROM_BYTES¶
TO_CHAR 関数をSnowflakeで同等の関数連結に変換するための翻訳仕様。
説明¶
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'
結果¶
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+---------+
23067 | Z\ESC | 5A1B |
Snowflake¶
クエリ¶
SELECT
--returns '23067'
TO_NUMBER('5A1B', 'XXXX'),
--returns 'Z\ESC '
!!!RESOLVE EWI!!! /*** SSC-EWI-0031 - FROM_BYTES FUNCTION NOT SUPPORTED ***/!!!
FROM_BYTES(TO_BINARY('5A3F'), 'ASCII'),
TO_BINARY('5A1B', 'HEX'); -- returns '5A1B'
結果¶
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+---------+
23067 | Z\ESC | 5A1B |
注釈
わかりやすくするため、出力コードの一部を省略しています。
既知の問題¶
TO_NUMBER 形式パラメーターは入力文字列の桁数と一致する必要があります。
ANSI にエンコードするとき、FROM_BYTES と機能的に等価な組み込み関数はありません
関連 EWIs¶
SSC-EWI-0031: FUNCTION NOT SUPPORTED
GETQUERYBANDVALUE¶
GetQueryBandValue をSnowflakeに変換するための翻訳仕様
説明¶
GetQueryBandValue 関数は、クエリバンド内の名前キーを検索し、関連付けられている値が存在する場合はそれを返します。トランザクション、セッション、プロファイル、またはクエリバンドのキーと値のペアの内部を検索するために使用できます。
この関数の詳細情報については、Teradataドキュメントの GetQueryBandValue を参照してください。
[SYSLIB.]GetQueryBandValue([QueryBandIn,] SearchType, Name);
サンプルソースパターン¶
セットアップデータ¶
Teradata¶
クエリ¶
SET QUERY_BAND = 'hola=hello;adios=bye;' FOR SESSION;
Snowflake¶
クエリ¶
ALTER SESSION SET QUERY_TAG = 'hola=hello;adios=bye;';
QueryBandIn パラメーターを含む GetQueryBandValue¶
Teradata¶
クエリ¶
SELECT
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'account') as Example1,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'account') as Example2,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 2, 'account') as Example3,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 3, 'account') as Example4,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'role') as Example5,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'role') as Example6;
結果¶
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200 | Mark200 | SaraDB | Peter3 | DbAdmin | |
+----------+----------+----------+----------+----------+----------+
Snowflake¶
クエリ¶
SELECT
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'account') as Example1,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'account') as Example2,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 2, 'account') as Example3,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 3, 'account') as Example4,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'role') as Example5,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'role') as Example6;
結果¶
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200 | Mark200 | SaraDB | Peter3 | DbAdmin | |
+----------+----------+----------+----------+----------+----------+
QueryBandIn パラメーターなしの GetQueryBandValue¶
Teradata¶
クエリ¶
SELECT
GETQUERYBANDVALUE(2, 'hola') as Example1,
GETQUERYBANDVALUE(2, 'adios') as Example2;
結果¶
+----------+----------+
| EXAMPLE1 | EXAMPLE2 |
+----------+----------+
| hello | bye |
+----------+----------+
Snowflake¶
クエリ¶
SELECT
GETQUERYBANDVALUE_UDF('hola') as Example1,
GETQUERYBANDVALUE_UDF('adios') as Example2;
結果¶
+----------+----------+
| EXAMPLE1 | EXAMPLE2 |
+----------+----------+
| hello | bye |
+----------+----------+
注釈
わかりやすくするため、出力コードの一部を省略しています。
既知の問題¶
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);
サンプルソースパターン¶
基本ソースパターン¶
Teradata¶
クエリ
SELECT JSON_CHECK('{"key": "value"}');
Snowflakeスクリプト¶
クエリ
SELECT
IFNULL(CHECK_JSON('{"key": "value"}'), 'OK');
CASE 変換の内部の JSON_CHECK¶
Teradata¶
クエリ
SELECT CASE WHEN JSON_CHECK('{}') = 'OK' then 'OKK' ELSE 'NOT OK' END;
Snowflakeスクリプト¶
クエリ
SELECT
CASE
WHEN UPPER(RTRIM(IFNULL(CHECK_JSON('{}'), 'OK'))) = UPPER(RTRIM('OK'))
THEN 'OKK' ELSE 'NOT OK'
END;
既知の問題¶
問題は見つかりませんでした。
関連 EWIs ¶
関連 EWIs はありません。
JSON_EXTRACT¶
Teradata関数 JSONExtractValue、JSONExtractLargeValue、JSONExtract をSnowflakeスクリプトに変換するための翻訳リファレンス。
説明¶
Teradataのドキュメントによると、これらの関数は JSONPath クエリ構文 を使用して、JSON インスタンスの一部に関する情報をリクエストします。希望するエンティティは、名前/値のペア、オブジェクト、配列、配列要素、値など、JSON インスタンスのどの部分でもかまいません。
Teradata JSONExtractValue、JSONExtractLargeValue、JSONExtract に関する情報は、こちら をご覧ください。
JSON_expr.JSONExtractValue(JSONPath_expr)
JSON_expr.JSONExtractLargeValue(JSONPath_expr)
JSON_expr.JSONExtract(JSONPath_expr)
JSON_EXTRACT_UDF は、 Stefan Goessner が開発したオリジナルの JavaScript 実装の修正バージョンを使用した、 JSONPath 仕様のSnowflake実装です。
サンプルソースパターン¶
Teradata¶
クエリ¶
SELECT
Store.JSONExtract('$..author') as AllAuthors,
Store.JSONExtractValue('$..book[2].title') as ThirdBookTitle,
Store.JSONExtractLargeValue('$..book[2].price') as ThirdBookPrice
FROM BookStores;
Snowflakeスクリプト¶
クエリ¶
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;
注釈
わかりやすくするため、出力コードの一部を省略しています。
既知の問題¶
1.JSONs 内の要素は、元の順序を保持しない場合があります。¶
JSON 内の要素は、テーブルに挿入されるとキー順に並びます。そのため、クエリ結果が異なる場合があります。しかし、これは JSON 内の配列の順番には影響しません。
例えば、オリジナルの JSON は:
{
"firstName":"Peter",
"lastName":"Andre",
"age":31,
"cities": ["Los Angeles", "Lima", "Buenos Aires"]
}
入力文字列を JSON ドキュメントとして解釈し、 VARIANT 値を生成する Snowflake PARSE_୧JSON() を使用します。入力される JSON は以下のようになります:
{
"age": 31,
"cities": ["Los Angeles", "Lima", "Buenos Aires"],
"firstName": "Peter",
"lastName": "Andre"
}
「age」が最初の要素になっていることに注目してください。しかし、「都市」の配列は元の順序を維持しています。
関連 EWIs¶
関連 EWIs はありません。
JSON_TABLE¶
JSON_TABLE をSnowflakeで同等のクエリに変換するための翻訳仕様
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
JSON ドキュメントの内容に基づいてテーブルを作成します。JSON_TABLE ドキュメント をご参照ください。
[TD_SYSFNLIB.]JSON_TABLE(
ON (json_documents_retrieving_expr)
USING
ROWEXPR (row_expr_literal)
COLEXPR (column_expr_literal)
[AS] correlation_name [(column_name [,...])]
)
JSON_TABLE の変換には、以下のような考慮事項があります。
ROW_NUMBER()は、Snowflakeにおける序列に相当します。
Teradataでは、生成された列が2番目の列を置き換えるため、JSON_TABLE の2番目の列は JSON 型でなければなりません。そのため、SnowConvert AI は列の型が正しいと仮定して、それを変換に使用します。
サンプルソースパターン¶
セットアップデータ¶
Teradata¶
クエリ¶
create table myJsonTable(
col1 integer,
col2 JSON(1000)
);
insert into myJsonTable values(1,
new json('{
"name": "Matt",
"age" : 30,
"songs" : [
{"name" : "Late night", "genre" : "Jazz"},
{"name" : "Wake up", "genre" : "Rock"},
{"name" : "Who am I", "genre" : "Rock"},
{"name" : "Raining", "genre" : "Blues"}
]
}'));
Snowflake¶
クエリ¶
CREATE OR REPLACE TABLE myJsonTable (
col1 integer,
col2 VARIANT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO myJsonTable
VALUES (1, TO_JSON(PARSE_JSON('{
"name": "Matt",
"age" : 30,
"songs" : [
{"name" : "Late night", "genre" : "Jazz"},
{"name" : "Wake up", "genre" : "Rock"},
{"name" : "Who am I", "genre" : "Rock"},
{"name" : "Raining", "genre" : "Blues"}
]
}')));
パターンコード1¶
Teradata¶
クエリ¶
SELECT * FROM
JSON_TABLE(ON (SELECT COL1, COL2 FROM myJsonTable WHERE col1 = 1)
USING rowexpr('$.songs[*]')
colexpr('[ {"jsonpath" : "$.name",
"type" : "CHAR(20)"},
{"jsonpath" : "$.genre",
"type" : "VARCHAR(20)"}]')) AS JT(ID, "Song name", Genre);
結果¶
ID | Song name | Genre |
---+------------+-------+
1 | Late night | Jazz |
---+------------+-------+
1 | Wake up | Rock |
---+------------+-------+
1 | Who am I | Rock |
---+------------+-------+
1 | Raining | Blues |
Snowflake¶
クエリ¶
SELECT
* FROM
(
SELECT
COL1 AS ID,
rowexpr.value:name :: CHAR(20) AS "Song name",
rowexpr.value:genre :: VARCHAR(20) AS Genre
FROM
myJsonTable,
TABLE(FLATTEN(INPUT => COL2:songs)) rowexpr
WHERE col1 = 1
) JT;
結果¶
ID | Song name | Genre |
---+------------+-------+
1 | Late night | Jazz |
---+------------+-------+
1 | Wake up | Rock |
---+------------+-------+
1 | Who am I | Rock |
---+------------+-------+
1 | Raining | Blues |
既知の問題¶
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 } ]
Snowflakeは UTF-8でのみ動作するため、NEW JSON 関数の2番目のパラメーターは、SnowConvert AI では常に省略されます。
サンプルソースパターン¶
文字列データを含む NEW JSON¶
Teradata¶
クエリ
SELECT NEW JSON ('{"name" : "cameron", "age" : 24}'),
NEW JSON ('{"name" : "cameron", "age" : 24}', LATIN);
結果
COLUMN1 |
COLUMN2 |
|---|---|
{"age":24,"name":"cameron"} |
{"age":24,"name":"cameron"} |
Snowflake¶
クエリ
SELECT
TO_JSON(PARSE_JSON('{"name" : "cameron", "age" : 24}')),
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'LATIN' NOT SUPPORTED ***/!!!
TO_JSON(PARSE_JSON('{"name" : "cameron", "age" : 24}'));
結果
COLUMN1 |
COLUMN2 |
|---|---|
{"age":24,"name":"cameron"} |
{"age":24,"name":"cameron"} |
既知の問題¶
1.2番目のパラメーターはサポートされていません
Snowflakeは UTF-8のみをサポートしているため、結果の JSON の形式を指定するために使用される関数の2番目のパラメーターはサポートされていません。このため、関数の一部の使用において機能上の違いが生じる可能性があります。
2.BINARY データを含む JSON はサポートされていません
Snowflakeは、バイナリデータを解析して JSON の値を作成することをサポートしていません。SnowConvert AI がバイナリデータを持つ NEW JSON を見つけると、ユーザーに警告が表示されます。
関連 EWIs¶
SSC-EWI-TD0039:入力形式がサポートされていません。
NVP¶
説明¶
キーが検索する指定された名前のn番目に出現するキーと一致するキーと値のペアの値を抽出します。NVP をご参照ください。
[TD_SYSFNLIB.] NVP (
in_string,
name_to_search
[, name_delimiters ]
[, value_delimiters ]
[, occurrence ]
)
サンプルソースパターン¶
NVP 基本ケース¶
Teradata¶
クエリ
SELECT
NVP('entree=-orange chicken&entree+.honey salmon', 'entree', '&', '=- +.', 1),
NVP('Hello=bye|name=Lucas|Hello=world!', 'Hello', '|', '=', 2),
NVP('Player=Mario$Game&Tenis%Player/Susana$Game=Chess', 'Player', '% $', '= & /', 2);
結果
COLUMN1 | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world! | Susana |
Snowflake¶
クエリ
SELECT
PUBLIC.NVP_UDF('entree=-orange chicken&entree+.honey salmon', 'entree', '&', '=- +.', 1),
PUBLIC.NVP_UDF('Hello=bye|name=Lucas|Hello=world!', 'Hello', '|', '=', 2),
PUBLIC.NVP_UDF('Player=Mario$Game&Tenis%Player/Susana$Game=Chess', 'Player', '% $', '= & /', 2);
結果
COLUMN1 | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world! | Susana |
オプションのパラメーターを含む NVP は無視されます¶
Teradata¶
クエリ
SELECT
NVP('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color'),
NVP('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color', 2),
NVP('City=Los Angeles#Color=Green#Color=Blue#City=San Jose', 'City', '#', '=');
結果
COLUMN1 | COLUMN2 | COLUMN3 |
--------+---------+-------------+
Green | Blue | Los Angeles |
Snowflake¶
クエリ
SELECT
PUBLIC.NVP_UDF('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color', '&', '=', 1),
PUBLIC.NVP_UDF('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color', '&', '=', 2),
PUBLIC.NVP_UDF('City=Los Angeles#Color=Green#Color=Blue#City=San Jose', 'City', '#', '=', 1);
結果
COLUMN1 | COLUMN2 | COLUMN3 |
--------+---------+-------------+
Green | Blue | Los Angeles |
区切り文字にスペースを含む NVP¶
Teradata¶
クエリ
SELECT
NVP('store = whole foods&&store: ?Bristol farms','store', '&&', '\ =\ :\ ?', 2),
NVP('Hello = bye|name = Lucas|Hello = world!', 'Hello', '|', '\ =\ ', 2);
結果
COLUMN1 | COLUMN2 |
--------------+---------+
Bristol farms | world! |
Snowflake¶
クエリ
SELECT
PUBLIC.NVP_UDF('store = whole foods&&store: ?Bristol farms', 'store', '&&', '\\ =\\ :\\ ?', 2),
PUBLIC.NVP_UDF('Hello = bye|name = Lucas|Hello = world!', 'Hello', '|', '\\ =\\ ', 2);
結果
COLUMN1 | COLUMN2 |
--------------+---------+
Bristol farms | world! |
リテラル以外の区切り文字を含む NVP¶
Teradata¶
クエリ
SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
Snowflake¶
クエリ
SELECT
PUBLIC.NVP_UDF('store = whole foods&&store: ?Bristol farms', 'store', '&&', valueDelimiter, 2) /*** SSC-FDM-TD0008 - WHEN NVP_UDF FOURTH PARAMETER IS NON-LITERAL AND IT CONTAINS A BACKSLASH, THAT BACKSLASH NEEDS TO BE ESCAPED ***/;
既知の問題¶
1. Delimiters with spaces (\ ) need to have the backslash escaped in Snowflake
In Teradata, delimiters including space specify them using "\ " (see NVP with spaces in delimiters), as shown in the examples, in Teradata it is not necessary to escape the backslash, however, it is necessary in Snowflake. Escaping the backslashes in the delimiter can be done automatically by SnowConvert AI but only if the delimiter values are literal strings, otherwise the user will be warned that the backlashes could not be eescaped and that it may cause different results in Snowflake.
関連 EWIs¶
SSC-FDM-TD0008: Non-literal delimiters with spaces need their backslash escaped in snowflake.
OVERLAPS¶
説明¶
Teradataのドキュメントによると、OVERLAPS 演算子は2つ以上の期間式を比較します。重複している場合はtrueを返します。
Teradataの OVERLAPS に関する情報は こちら をご覧ください。
period_expression
OVERLAPS
period_expression
PERIOD_OVERLAPS_UDF は、Teradataの OVERLAPS 演算子をSnowflakeで実装したものです。
サンプルソースパターン¶
Teradata¶
クエリ
SELECT
PERIOD(DATE '2009-01-01', DATE '2010-09-24')
OVERLAPS
PERIOD(DATE '2009-02-01', DATE '2009-06-24');
Snowflakeスクリプト¶
クエリ
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 ***/!!!;
既知の問題¶
1.サポートされていない期間式¶
PERIOD(TIME WITH TIME ZONE) および PERIOD(TIMESTAMP WITH TIME ZONE) 式はまだサポートされていません。
関連 EWIs¶
SSC-EWI-TD0053:Snowflakeはperiodデータ型をサポートしておらず、すべてのperiodはvarcharとして処理されます
P_INTERSECT¶
説明¶
Teradataのドキュメントによると、P_INTERSECT 演算子は2つ以上の期間式を比較します。重複している場合は、期間式の共通部分を返します。
TeradataのP_INTERSECT に関する詳細については、 こちら をご参照ください。
period_expression
P_INTERSECT
period_expression
PERIOD_INTERSECT_UDF は、TeradataのP_INTERSECT 演算子をSnowflakeで実装したものです。
サンプルソースパターン¶
Teradata¶
クエリ
SELECT
PERIOD(DATE '2009-01-01', DATE '2010-09-24')
P_INTERSECT
PERIOD(DATE '2009-02-01', DATE '2009-06-24');
Snowflakeスクリプト¶
クエリ
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 ***/!!!;
既知の問題¶
1.サポートされていない期間式¶
PERIOD(TIME WITH TIME ZONE) および PERIOD(TIMESTAMP WITH TIME ZONE) 式はまだサポートされていません。
関連 EWIs¶
SSC-EWI-TD0053:Snowflakeはperiodデータ型をサポートしておらず、すべてのperiodはvarcharとして処理されます
PIVOT¶
Translation specification for the PIVOT function from Teradata to Snowflake
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
ピボット関数は、テーブルの行を列に変換するために使用します。詳細は、 PIVOT Teradataドキュメント をご参照ください。
PIVOT ( pivot_spec )
[ WITH with_spec [,...] ]
[AS] derived_table_name [ ( cname [,...] ) ]
pivot_spec := aggr_fn_spec [,...] FOR for_spec
aggr_fn_spec := aggr_fn ( cname ) [ [AS] pvt_aggr_alias ]
for_spec := { cname IN ( expr_spec_1 [,...] ) |
( cname [,...] ) IN ( expr_spec_2 [,...] ) |
cname IN ( subquery )
}
expr_spec_1 := expr [ [AS] expr_alias_name ]
expr_spec_2 := ( expr [,...] ) [ [AS] expr_alias_name ]
with_spec := aggr_fn ( { cname [,...] | * } ) [AS] aggr_alias
サンプルソースパターン¶
セットアップデータ¶
Teradata¶
クエリ¶
CREATE TABLE star1(
country VARCHAR(20),
state VARCHAR(10),
yr INTEGER,
qtr VARCHAR(3),
sales INTEGER,
cogs INTEGER
);
insert into star1 values ('USA', 'CA', 2001, 'Q1', 30, 15);
insert into star1 values ('Canada', 'ON', 2001, 'Q2', 10, 0);
insert into star1 values ('Canada', 'BC', 2001, 'Q3', 10, 0);
insert into star1 values ('USA', 'NY', 2001, 'Q1', 45, 25);
insert into star1 values ('USA', 'CA', 2001, 'Q2', 50, 20);
Snowflake¶
クエリ¶
CREATE OR REPLACE TABLE star1 (
country VARCHAR(20),
state VARCHAR(10),
yr INTEGER,
qtr VARCHAR(3),
sales INTEGER,
cogs INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO star1
VALUES ('USA', 'CA', 2001, 'Q1', 30, 15);
INSERT INTO star1
VALUES ('Canada', 'ON', 2001, 'Q2', 10, 0);
INSERT INTO star1
VALUES ('Canada', 'BC', 2001, 'Q3', 10, 0);
INSERT INTO star1
VALUES ('USA', 'NY', 2001, 'Q1', 45, 25);
INSERT INTO star1
VALUES ('USA', 'CA', 2001, 'Q2', 50, 20);
基本的な PIVOT 変換¶
Teradata¶
クエリ¶
SELECT *
FROM star1 PIVOT (
SUM(sales) FOR qtr
IN ('Q1',
'Q2',
'Q3')
)Tmp;
結果¶
Country | State | yr | cogs | 'Q1' | 'Q2' | 'Q3' |
--------+-------+------+------+------+------+------+
Canada | BC | 2001 | 0 | null | null | 10 |
--------+-------+------+------+------+------+------+
USA | NY | 2001 | 25 | 45 | null | null |
--------+-------+------+------+------+------+------+
Canada | ON | 2001 | 0 | null | 10 | null |
--------+-------+------+------+------+------+------+
USA | CA | 2001 | 20 | null | 50 | null |
--------+-------+------+------+------+------+------+
USA | CA | 2001 | 15 | 30 | null | null |
--------+-------+------+------+------+------+------+
Snowflake¶
クエリ¶
SELECT
*
FROM
star1 PIVOT(
SUM(sales) FOR qtr IN ('Q1',
'Q2',
'Q3'))Tmp;
結果¶
Country | State | yr | cogs | 'Q1' | 'Q2' | 'Q3' |
--------+-------+------+------+------+------+------+
Canada | BC | 2001 | 0 | null | null | 10 |
--------+-------+------+------+------+------+------+
USA | NY | 2001 | 25 | 45 | null | null |
--------+-------+------+------+------+------+------+
Canada | ON | 2001 | 0 | null | 10 | null |
--------+-------+------+------+------+------+------+
USA | CA | 2001 | 20 | null | 50 | null |
--------+-------+------+------+------+------+------+
USA | CA | 2001 | 15 | 30 | null | null |
--------+-------+------+------+------+------+------+
エイリアス変換を含む PIVOT¶
Teradata¶
クエリ¶
SELECT *
FROM star1 PIVOT (
SUM(sales) as ss1 FOR qtr
IN ('Q1' AS Quarter1,
'Q2' AS Quarter2,
'Q3' AS Quarter3)
)Tmp;
結果¶
Country | State | yr | cogs | Quarter1_ss1 | Quarter2_ss1 | Quarter3_ss1 |
--------+-------+------+------+--------------+--------------+--------------+
Canada | BC | 2001 | 0 | null | null | 10 |
--------+-------+------+------+--------------+--------------+--------------+
USA | NY | 2001 | 25 | 45 | null | null |
--------+-------+------+------+--------------+--------------+--------------+
Canada | ON | 2001 | 0 | null | 10 | null |
--------+-------+------+------+--------------+--------------+--------------+
USA | CA | 2001 | 20 | null | 50 | null |
--------+-------+------+------+--------------+--------------+--------------+
USA | CA | 2001 | 15 | 30 | null | null |
--------+-------+------+------+--------------+--------------+--------------+
Snowflake¶
クエリ¶
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
star1 PIVOT(
SUM(sales) FOR qtr IN (
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
'Q1',
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
'Q2',
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
'Q3'))Tmp;
結果¶
Country | State | yr | cogs | Quarter1_ss1 | Quarter2_ss1 | Quarter3_ss1 |
--------+-------+------+------+--------------+--------------+--------------+
Canada | BC | 2001 | 0 | null | null | 10 |
--------+-------+------+------+--------------+--------------+--------------+
USA | NY | 2001 | 25 | 45 | null | null |
--------+-------+------+------+--------------+--------------+--------------+
Canada | ON | 2001 | 0 | null | 10 | null |
--------+-------+------+------+--------------+--------------+--------------+
USA | CA | 2001 | 20 | null | 50 | null |
--------+-------+------+------+--------------+--------------+--------------+
USA | CA | 2001 | 15 | 30 | null | null |
--------+-------+------+------+--------------+--------------+--------------+
既知の問題¶
1.WITH 句はサポートされていません
WITH 句の使用は現在サポートされていません。
2.複数のピボット列でのピボットはサポートされていません
SnowConvert AI は、PIVOT 関数をSnowflakeのPIVOT 関数に変換しています。この関数は、単一の列に対する関数の適用のみをサポートしています。
3.複数の集計関数によるピボットはサポートされていません
Snowflakeの PIVOT 関数は、データに対して1つの集計関数の適用しかサポートしていません。
4.IN 句のサブクエリはサポートされていません
Snowflake PIVOT 関数の IN 句はサブクエリを受け付けません。
5.エイリアスは、すべての IN 句要素にエイリアスがあり、テーブル指定が存在する場合にのみサポートされます
エイリアスを持つ列名が同等であるためには、SnowConvert AI では、IN 句で指定されたすべての値に1つのエイリアスが指定され、入力コードにテーブル仕様が存在する必要があります。これは、SnowConvert AI が結果のテーブルのエイリアスリストを正常に作成するために必要です。
関連 EWIs¶
SSC-EWI-0015: The input pivot/unpivot statement format is not supported
RANK¶
RANK() 関数を変換するための翻訳仕様
説明¶
RANK は結果セットをソートし、結果の各行の順位を数値で識別します。RANK の引数はソート列のみで、関数は結果の各行の順位を表す整数を返します。(Teradataの RANK)
Teradata構文¶
RANK ( sort_expression [ ASC | DESC ] [,...] )
Snowflake構文¶
RANK() OVER
(
[ PARTITION BY <expr1> ]
ORDER BY <expr2> [ { ASC | DESC } ]
[ <window_frame> ]
)
サンプルソースパターン¶
セットアップデータ¶
Teradata¶
クエリ¶
CREATE TABLE Sales (
Product VARCHAR(255),
Sales INT
);
INSERT INTO Sales (Product, Sales) VALUES ('A', 100);
INSERT INTO Sales (Product, Sales) VALUES ('B', 150);
INSERT INTO Sales (Product, Sales) VALUES ('C', 200);
INSERT INTO Sales (Product, Sales) VALUES ('D', 150);
INSERT INTO Sales (Product, Sales) VALUES ('E', 120);
INSERT INTO Sales (Product, Sales) VALUES ('F', NULL);
Snowflake¶
クエリ¶
CREATE OR REPLACE TABLE Sales (
Product VARCHAR(255),
Sales INT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO Sales (Product, Sales)
VALUES ('A', 100);
INSERT INTO Sales (Product, Sales)
VALUES ('B', 150);
INSERT INTO Sales (Product, Sales)
VALUES ('C', 200);
INSERT INTO Sales (Product, Sales)
VALUES ('D', 150);
INSERT INTO Sales (Product, Sales)
VALUES ('E', 120);
INSERT INTO Sales (Product, Sales)
VALUES ('F', NULL);
ASC、 DESC、DEFAULT の順序を使用する RANK()¶
Teradata¶
警告
RANK()を呼び出す際のTeradataの順序付けデフォルト値は、 DESC であることに注意してください。ただし、Snowflakeのデフォルトは ASC です。したがって、 RANK()の変換では、順序が指定されていない場合、DESC が追加されます。
クエリ¶
SELECT
Sales,
RANK(Sales ASC) AS SalesAsc,
RANK(Sales DESC) AS SalesDesc,
RANK(Sales) AS SalesDefault
FROM
Sales;
結果¶
| SALES | SALESASC | SALESDESC | SALESDEFAULT |
|---|---|---|---|
| NULL | 6 | 6 | 6 |
| 200 | 5 | 1 | 1 |
| 150 | 3 | 2 | 2 |
| 150 | 3 | 2 | 2 |
| 120 | 2 | 4 | 4 |
| 100 | 1 | 5 | 5 |
Snowflake¶
クエリ¶
SELECT
Sales,
RANK() OVER (
ORDER BY
Sales ASC) AS SalesAsc,
RANK() OVER (
ORDER BY
Sales DESC NULLS LAST) AS SalesDesc,
RANK() OVER (
ORDER BY
Sales DESC NULLS LAST) AS SalesDefault
FROM
Sales;
結果¶
| SALES | SALESASC | SALESDESC | SALESDEFAULT |
|---|---|---|---|
| NULL | 6 | 6 | 6 |
| 200 | 5 | 1 | 1 |
| 150 | 3 | 2 | 2 |
| 150 | 3 | 2 | 2 |
| 120 | 2 | 4 | 4 |
| 100 | 1 | 5 | 5 |
既知の問題¶
問題は見つかりませんでした。
関連 EWIs ¶
関連 EWIs はありません。
正規表現関数¶
説明¶
TeradataもSnowflakeも、varchar入力に正規表現を適用する関数をサポートしています。詳細については、 Teradataドキュメント および Snowflakeドキュメント を参照してください。
REGEXP_SUBSTR(source. regexp [, position, occurrence, match])
REGEXP_REPLACE(source. regexp [, replace_string, position, occurrence, match])
REGEXP_INSTR(source. regexp [, position, occurrence, return_option, match])
REGEXP_SIMILAR(source. regexp [, match])
REGEXP_SPLIT_TO_TABLE(inKey. source. regexp, match)
サンプルソースパターン¶
セットアップデータ¶
Teradata¶
クエリ
CREATE TABLE regexpTable
(
col1 CHAR(35)
);
INSERT INTO regexpTable VALUES('hola');
Snowflake¶
クエリ
CREATE OR REPLACE TABLE regexpTable
(
col1 CHAR(35)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO regexpTable
VALUES ('hola');
正規表現変換の例¶
Teradata¶
クエリ
SELECT
REGEXP_REPLACE(col1,'.*(h(i|o))','ha', 1, 0, 'x'),
REGEXP_SUBSTR(COL1,'.*(h(i|o))', 2, 1, 'x'),
REGEXP_INSTR(COL1,'.*(h(i|o))',1, 1, 0, 'x'),
REGEXP_SIMILAR(COL1,'.*(h(i|o))', 'xl')
FROM regexpTable;
結果
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala |null |1 |0 |
Snowflake¶
クエリ
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "regexpTable" **
SELECT
REGEXP_REPLACE(col1, '.*(h(i|o))', 'ha', 1, 0),
REGEXP_SUBSTR(COL1, '.*(h(i|o))', 2, 1),
REGEXP_INSTR(COL1, '.*(h(i|o))', 1, 1, 0),
--** SSC-FDM-TD0016 - VALUE 'l' FOR PARAMETER 'match_arg' IS NOT SUPPORTED IN SNOWFLAKE **
REGEXP_LIKE(COL1, '.*(h(i|o))')
FROM
regexpTable;
結果
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala |null |1 |FALSE |
既知の問題¶
1.Snowflakeは POSIX 正規表現のみをサポートしています
SnowConvert AI が POSIX 以外の正規表現を見つけると、警告が表示されます。
2.Teradataの「match_arg」オプション「l」はSnowflakeでサポートされていません
Snowflakeではオプション「l」に対応するものがなく、SnowConvert AI がこれを見つけると、警告が表示されます。
3.CHAR データ型のサイズが固定されているため、動作が異なる場合があります
Teradataの正規表現関数の中には、テーブルの CHAR データ型の列全体にマッチさせようとするものがあります。たとえ、より小さい文字列が挿入されたために列の文字が空になっていたとしてもです。Snowflakeでは、 CHAR データ型が可変サイズであるため、このようなことは起こりません。
4.REGEXP_SPLIT_TO_TABLE はサポートされていません
この関数は現在Snowflakeではサポートされていません。
関連 EWIs¶
SSC-FDM-0007:依存関係が欠落している要素。
SSC-FDM-TD0016:パラメーター「match_arg」の値「l」はSnowflakeではサポートされていません。
STRTOK_SPLIT_TO_TABLE¶
説明¶
文字列を提供された区切り文字を使用してテーブルに分割します。詳細は STRTOK_SPLIT_TO_TABLE をご参照ください。
[TD_SYSFNLIB.] STRTOK_SPLIT_TO_TABLE ( inkey, instring, delimiters )
RETURNS ( outkey, tokennum, token )
サンプルソースパターン¶
セットアップデータ¶
Teradata¶
クエリ
CREATE TABLE strtokTable
(
col1 INTEGER,
col2 VARCHAR(100)
);
INSERT INTO strtokTable VALUES(4, 'hello-world-split-me');
INSERT INTO strtokTable VALUES(1, 'string$split$by$dollars');
Snowflake¶
クエリ
CREATE OR REPLACE TABLE strtokTable
(
col1 INTEGER,
col2 VARCHAR(100)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO strtokTable
VALUES (4, 'hello-world-split-me');
INSERT INTO strtokTable
VALUES (1, 'string$split$by$dollars');
STRTOK_SPLIT_TO_TABLE 変換¶
Teradata¶
クエリ
SELECT outkey, tokennum, token FROM table(STRTOK_SPLIT_TO_TABLE(strtokTable.col1, strtokTable.col2, '-$')
RETURNS (outkey INTEGER, tokennum INTEGER, token VARCHAR(100))) AS testTable
ORDER BY outkey, tokennum;
結果
outkey |tokennum | token |
-------+---------+--------+
1 |1 |string |
-------+---------+--------+
1 |2 |split |
-------+---------+--------+
1 |3 |by |
-------+---------+--------+
1 |4 |dollars |
-------+---------+--------+
4 |1 |hello |
-------+---------+--------+
4 |2 |world |
-------+---------+--------+
4 |3 |split |
-------+---------+--------+
4 |4 |me |
Snowflake¶
クエリ
SELECT
CAST(strtokTable.col1 AS INTEGER) AS outkey,
CAST(INDEX AS INTEGER) AS tokennum,
CAST(VALUE AS VARCHAR) AS token
FROM
strtokTable,
table(STRTOK_SPLIT_TO_TABLE(strtokTable.col2, '-$')) AS testTable
ORDER BY outkey, tokennum;
結果
outkey |tokennum | token |
-------+---------+--------+
1 |1 |string |
-------+---------+--------+
1 |2 |split |
-------+---------+--------+
1 |3 |by |
-------+---------+--------+
1 |4 |dollars |
-------+---------+--------+
4 |1 |hello |
-------+---------+--------+
4 |2 |world |
-------+---------+--------+
4 |3 |split |
-------+---------+--------+
4 |4 |me |
既知の問題¶
既知の問題はありません。
関連 EWIs ¶
関連 EWIs はありません。
SUBSTRING¶
説明¶
与えられた入力文字列から部分文字列を抽出します。詳細は SUBSTRING/SUBSTR をご参照ください。
SUBSTRING(string_expr FROM n1 [FOR n2])
SUBSTR(string_expr, n1, [, n2])
部分文字列の取得を開始する値(n1)が1未満の場合、代わりに SUBSTR_UDF が挿入されます。
サンプルソースパターン¶
SUBSTRING 変換¶
Teradata¶
クエリ
SELECT SUBSTR('Hello World!', 2, 6),
SUBSTR('Hello World!', -2, 6),
SUBSTRING('Hello World!' FROM 2 FOR 6),
SUBSTRING('Hello World!' FROM -2 FOR 6);
結果
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W |Hel |ello W |Hel |
Snowflake¶
クエリ
SELECT
SUBSTR('Hello World!', 2, 6),
PUBLIC.SUBSTR_UDF('Hello World!', -2, 6),
SUBSTRING('Hello World!', 2, 6),
PUBLIC.SUBSTR_UDF('Hello World!', -2, 6);
結果
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W |Hel |ello W |Hel |
関連 EWIs¶
関連 EWIs はありません。
TD_UNPIVOT¶
TD_UNPIVOT をSnowflakeで同等のクエリに変換するための翻訳仕様
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
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' } )
]
)
以下の変換は、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);
Snowflake¶
クエリ¶
CREATE OR REPLACE TABLE superunpivottest (
myKey INTEGER NOT NULL PRIMARY KEY,
firstSemesterIncome DECIMAL(10,2),
secondSemesterIncome DECIMAL(10,2),
firstSemesterExpenses DECIMAL(10,2),
secondSemesterExpenses DECIMAL(10,2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO superUnpivottest
VALUES (2020, 15440, 25430.57, 10322.15, 12355.36);
INSERT INTO superUnpivottest
VALUES (2018, 18325.25, 25220.65, 15560.45, 15680.33);
INSERT INTO superUnpivottest
VALUES (2019, 23855.75, 34220.22, 14582.55, 24122);
TD_UNPIVOT 変換¶
Teradata¶
クエリ¶
SELECT * FROM
TD_UNPIVOT(
ON superunpivottest
USING
VALUE_COLUMNS('Income', 'Expenses')
UNPIVOT_COLUMN('Semester')
COLUMN_LIST('firstSemesterIncome, firstSemesterExpenses', 'secondSemesterIncome, secondSemesterExpenses')
COLUMN_ALIAS_LIST('First', 'Second')
)X ORDER BY mykey, Semester;
結果¶
myKey |Semester |Income | Expenses |
------+---------+---------+----------+
2018 |First |18325.25 |15560.45 |
------+---------+---------+----------+
2018 |Second |25220.65 |15680.33 |
------+---------+---------+----------+
2019 |First |23855.75 |14582.55 |
------+---------+---------+----------+
2019 |Second |34220.22 |24122.00 |
------+---------+---------+----------+
2020 |First |15440.00 |10322.15 |
------+---------+---------+----------+
2020 |Second |25430.57 |12355.36 |
Snowflake¶
クエリ¶
SELECT
* FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0061 - TD_UNPIVOT TRANSFORMATION REQUIRES COLUMN INFORMATION THAT COULD NOT BE FOUND, COLUMNS MISSING IN RESULT ***/!!!
(
SELECT
TRIM(GET_IGNORE_CASE(OBJECT_CONSTRUCT('FIRSTSEMESTERINCOME', 'First', 'FIRSTSEMESTEREXPENSES', 'First', 'SECONDSEMESTERINCOME', 'Second', 'SECONDSEMESTEREXPENSES', 'Second'), Semester), '"') AS Semester,
Income,
Expenses
FROM
superunpivottest UNPIVOT(Income FOR Semester IN (
firstSemesterIncome,
secondSemesterIncome
)) UNPIVOT(Expenses FOR Semester1 IN (
firstSemesterExpenses,
secondSemesterExpenses
))
WHERE
Semester = 'FIRSTSEMESTERINCOME'
AND Semester1 = 'FIRSTSEMESTEREXPENSES'
OR Semester = 'SECONDSEMESTERINCOME'
AND Semester1 = 'SECONDSEMESTEREXPENSES'
) X ORDER BY mykey, Semester;
結果¶
myKey |Semester |Income | Expenses |
------+---------+---------+----------+
2018 |First |18325.25 |15560.45 |
------+---------+---------+----------+
2018 |Second |25220.65 |15680.33 |
------+---------+---------+----------+
2019 |First |23855.75 |14582.55 |
------+---------+---------+----------+
2019 |Second |34220.22 |24122.00 |
------+---------+---------+----------+
2020 |First |15440.00 |10322.15 |
------+---------+---------+----------+
2020 |Second |25430.57 |12355.36 |
既知の問題¶
INCLUDE_NULLS 句が YES に設定された TD_UNPIVOT はサポートされていません
変換で使用されるSnowflake UNPIVOT 関数は常にnull値を無視し、 INCLUDE_NULLS 句が YES にセットされている場合、ユーザーはサポートされていないことを警告されます。
関数を正しく変換するには、テーブル情報が必要です
SnowConvert AI では、TD_UNPIVOT 関数で使用される列の名前が必要です。ユーザーが関数のquery_expressionに列リストは含めていないが、ピボット解除するテーブルの名前は指定する場合、テーブル定義から列名を取得しようとします。名前が見つからない場合は、結果のクエリで列が失われる可能性があることが警告されます。
関連 EWIs¶
SSC-EWI-TD0061: TD_UNPIVOT 変換に必要な列情報が見当たらず、結果の列が欠落しています
TO_CHAR¶
説明¶
TO_CHAR 関数は、 DateTime または数値を文字列にキャストします。詳細は TO_CHAR(Numeric)および TO_CHAR(DateTime) をご参照ください。
-- Numeric version
[TD_SYSFNLIB.]TO_CHAR(numeric_expr [, format_arg [, nls_param]])
-- DateTime version
[TD_SYSFNLIB.]TO_CHAR(dateTime_expr [, format_arg])
SnowflakeとTeradataの両方に独自のバージョンの TO_CHAR 関数があります。ただし、Teradataは、Snowflakeがネイティブにサポートしていない多くのフォーマットをサポートしています。これらのフォーマット要素をサポートするために、SnowConvert AI は Snowflake組み込み関数とカスタム UDFs を使用して、Teradataの元の TO_CHAR 関数と同じ文字列を作成する連結式を生成します。
サンプルソースパターン¶
TO_CHAR(DateTime)変換¶
Teradata¶
クエリ
SELECT
TO_CHAR(date '2012-12-23'),
TO_CHAR(date '2012-12-23', 'DS'),
TO_CHAR(date '2012-12-23', 'DAY DD, MON YY');
結果
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
Snowflake¶
クエリ
SELECT
TO_CHAR(date '2012-12-23') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
TO_CHAR(date '2012-12-23', 'MM/DD/YYYY') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
PUBLIC.DAYNAME_LONG_UDF(date '2012-12-23', 'uppercase') || TO_CHAR(date '2012-12-23', ' DD, ') || PUBLIC.MONTH_SHORT_UDF(date '2012-12-23', 'uppercase') || TO_CHAR(date '2012-12-23', ' YY') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;
結果
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
TO_CHAR(Numeric)変換¶
Teradata¶
クエリ
SELECT
TO_CHAR(1255.495),
TO_CHAR(1255.495, '9.9EEEE'),
TO_CHAR(1255.495, 'SC9999.9999', 'nls_iso_currency = ''EUR''');
結果
COLUMN1 | COLUMN2 | COLUMN3 |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |
Snowflake¶
クエリ
SELECT
TO_CHAR(1255.495) /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
TO_CHAR(1255.495, '9.0EEEE') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
PUBLIC.INSERT_CURRENCY_UDF(TO_CHAR(1255.495, 'S9999.0000'), 2, 'EUR') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;
結果
COLUMN1 | COLUMN2 | COLUMN3 |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |
既知の問題¶
1.動作が異なる、またはサポートされていない形式
Teradataは、TO_CHAR 関数の変換後にSnowflakeで異なる動作を示す可能性のあるフォーマット要素の広範なリストを提供しています。動作が異なるまたはサポートされていない要素のリストについては、 SSC-EWI-TD0029 をご参照ください。
関連 EWIs¶
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 } ]
サンプルソースパターン¶
セットアップデータ¶
Teradata¶
クエリ
create table orders (
o_orderkey int,
o_totalprice float);
insert into orders values (1,500000);
insert into orders values (2,100000);
insert into orders values (3,600000);
insert into orders values (4,700000);
Snowflake¶
クエリ
CREATE OR REPLACE TABLE orders (
o_orderkey int,
o_totalprice float)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO orders
VALUES (1,500000);
INSERT INTO orders
VALUES (2,100000);
INSERT INTO orders
VALUES (3,600000);
INSERT INTO orders
VALUES (4,700000);
XMLAGG 変換¶
Teradata¶
クエリ
select
xmlagg(o_orderkey order by o_totalprice desc) (varchar(10000))
from orders
where o_totalprice > 5;
結果
COLUMN1 |
--------+
4 3 1 2 |
Snowflake¶
クエリ
SELECT
LEFT(TO_VARCHAR(LISTAGG ( o_orderkey, ' ')
WITHIN GROUP(
order by o_totalprice DESC NULLS LAST)), 10000)
from
orders
where o_totalprice > 5;
結果
COLUMN1 |
--------+
4 3 1 2 |
既知の問題¶
1.RETURNING 句は現在サポートされていません。
ユーザーには、返り句の翻訳が将来追加されることが警告されます。
関連 EWIs ¶
関連 EWIs はありません。
CAST¶
Numberデータ型からVarcharデータ型へのキャスト¶
Teradataはvarcharにキャストする際、各数値データ型にデフォルトのフォーマットを使用するため、SnowConvert AI はプラットフォーム間で等価性を保つためにフォーマットを追加します。
サンプルソースパターン¶
BYTEINT¶
Teradata¶
クエリ
SELECT '"'||cast(cast(12 as BYTEINT) as varchar(10))||'"';
結果
(('"'||12)||'"')|
----------------+
"12" |
Snowflake¶
クエリ
SELECT
'"'|| LEFT(TO_VARCHAR(cast(12 as BYTEINT), 'TM'), 10) ||'"';
結果
"'""'|| LEFT(TO_VARCHAR(CAST(12 AS BYTEINT), 'TM'), 10) ||'""'"
---------------------------------------------------------------
"12"
SMALLINT¶
Teradata¶
クエリ
SELECT '"'||cast(cast(123 as SMALLINT) as varchar(10))||'"';
結果
(('"'||123)||'"')|
-----------------+
"123" |
Snowflake¶
クエリ
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'"';
結果
"'""'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"123"
INTEGER¶
Teradata¶
クエリ
SELECT '"'||cast(cast(12345 as INTEGER) as varchar(10))||'"';
結果
(('"'||12345)||'"')|
-------------------+
"12345" |
Snowflake¶
クエリ
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'"';
結果
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'""'"
------------------------------------------------------------------
"12345"
BIGINT¶
Teradata¶
クエリ
SELECT '"'||cast(cast(12345 as BIGINT) as varchar(10))||'"';
結果
(('"'||12345)||'"')|
-------------------+
"12345" |
Snowflake¶
クエリ
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'"';
結果
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"12345"
DECIMAL[(n[,m])]または NUMERIC[(n[,m])]¶
Teradata¶
クエリ
SELECT '"'||cast(cast(12345 as DECIMAL) as varchar(10))||'"',
'"'||cast(cast(12345 as DECIMAL(12, 2)) as varchar(10))||'"';
結果
(('"'||12345)||'"')|(('"'||12345)||'"')|
-------------------+-------------------+
"12345." |"12345.00" |
Snowflake¶
クエリ
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL), 'TM.'), 10) ||'"',
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL(12, 2)), 'TM'), 10) ||'"';
結果
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL), 'TM.'), 10) ||'"' '"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL(12, 2)), 'TM'), 10) ||'"'
"12345." "12345.00"
既知の問題¶
Teradataは0から1までの数値をSnowflakeとは異なる方法で扱います。これらの値に対して、Teradataはドットの前にゼロを追加しませんが、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;
結果
COLUMN1 |COLUMN2
-----------------+--------------+
"-.10" |".10" |
Snowflake¶
クエリ
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(-0.1 AS DECIMAL(12, 2)), 'TM'), 10) ||'"' AS column1,
'"'|| LEFT(TO_VARCHAR(CAST(0.1 AS DECIMAL(12, 2)), 'TM'), 10) ||'"' AS column2;
結果
COLUMN1 |COLUMN2
------------------+---------------+
"-0.10" |"0.10" |
関連 EWIs ¶
関連 EWIs はありません。
{ } を使用して DATE にキャストする¶
説明¶
次の構文は、中括弧で囲まれた文字列定義の前にdを置くことで、日付形式文字列を DATE データ型にキャストします。
SELECT {d '1233-10-10'}
サンプルソースパターン¶
中括弧を使用して DATE にキャストする¶
Teradata
日付のキャスト
SELECT * FROM RESOURCE_DETAILS where change_ts >= {d '2022-09-10'};
Snowflake
日付のキャスト
SELECT
* FROM
PUBLIC.RESOURCE_DETAILS
where change_ts >= DATE('2022-09-10');
INTERVAL データ型にキャストする¶
説明¶
Snowflakeはインターバルデータ型をサポートしていませんが、DateTime 操作で使用できる INTERVAL 定数があり、その他の用途は VARCHAR を使用してエミュレートできます。SnowConvert AI は、INTERVAL データ型に対するCAST 関数を、ケースに応じて同等のものに変換します。
キャストされる値が間隔型の場合、新しい間隔に相当する文字列を生成するために UDF が生成されます
When the value is a literal, a Snowflake interval constant will be generated if the cast is used in a datetime operation, otherwise a literal string will be generated
値がリテラルでない場合、文字列へのキャストが生成されます
サンプルソースパターン¶
非インターバルリテラル¶
Teradata¶
クエリ
SELECT TIMESTAMP '2022-10-15 10:30:00' + CAST ('12:34:56.78' AS INTERVAL HOUR(2) TO SECOND(2)) AS VARCHAR_TO_INTERVAL,
TIMESTAMP '2022-10-15 10:30:00' + CAST(-5 AS INTERVAL YEAR(4)) AS NUMBER_TO_INTERVAL,
CAST('07:00' AS INTERVAL HOUR(2) TO MINUTE) AS OUTSIDE_DATETIME_OPERATION;
結果
VARCHAR_TO_INTERVAL | NUMBER_TO_INTERVAL | OUTSIDE_DATETIME_OPERATION |
--------------------+--------------------+----------------------------+
2022-10-15 23:04:56 |2017-10-15 10:30:00 | 7:00 |
Snowflake¶
クエリ
SELECT
TIMESTAMP '2022-10-15 10:30:00' + INTERVAL '12 HOUR, 34 MINUTE, 56 SECOND, 780000 MICROSECOND' AS VARCHAR_TO_INTERVAL,
TIMESTAMP '2022-10-15 10:30:00' + INTERVAL '-5 YEAR' AS NUMBER_TO_INTERVAL,
'07:00' AS OUTSIDE_DATETIME_OPERATION;
結果
VARCHAR_TO_INTERVAL | NUMBER_TO_INTERVAL | OUTSIDE_DATETIME_OPERATION |
------------------------+------------------------+----------------------------+
2022-10-15 23:04:56.780 |2017-10-15 10:30:00.000 | 07:00 |
非リテラルかつ非インターバルの値¶
Teradata¶
クエリ
SELECT TIMESTAMP '2022-10-15 10:30:00' + CAST('20 ' || '10' AS INTERVAL DAY TO HOUR) AS DATETIME_OPERATION,
CAST('20 ' || '10' AS INTERVAL DAY TO HOUR) AS OUTSIDE_DATETIME_OPERATION;
結果
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-11-04 20:30:00 | 20 10 |
Snowflake¶
クエリ
SELECT
PUBLIC.DATETIMEINTERVALADD_UDF(TIMESTAMP '2022-10-15 10:30:00', CAST('20 ' || '10' AS VARCHAR(21)), 'DAY', '+') AS DATETIME_OPERATION,
CAST('20 ' || '10' AS VARCHAR(21)) AS OUTSIDE_DATETIME_OPERATION;
結果
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-11-04 20:30:00.000 | 20 10 |
間隔を別の間隔にキャスト¶
Teradata¶
クエリ
SELECT
TIMESTAMP '2022-10-15 10:30:00' + CAST(INTERVAL '5999' MINUTE AS INTERVAL DAY TO HOUR) AS DATETIME_OPERATION,
CAST(INTERVAL '5999' MINUTE AS INTERVAL DAY TO HOUR) AS OUTSIDE_DATETIME_OPERATION;
結果
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-10-19 13:30:00 | 4 03 |
Snowflake¶
クエリ
SELECT
PUBLIC.DATETIMEINTERVALADD_UDF(
TIMESTAMP '2022-10-15 10:30:00', PUBLIC.INTERVALTOINTERVAL_UDF('5999', 'MINUTE', 'MINUTE', 'DAY', 'HOUR'), 'DAY', '+') AS DATETIME_OPERATION,
PUBLIC.INTERVALTOINTERVAL_UDF('5999', 'MINUTE', 'MINUTE', 'DAY', 'HOUR') AS OUTSIDE_DATETIME_OPERATION;
結果
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-10-19 13:30:00.000 | 4 03 |
既知の問題¶
既知の問題はありません。
関連 EWIs¶
関連 EWIs はありません。