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
CURTIME

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')
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 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');
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を返します。

既知の問題

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

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

結果

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

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'
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 をSnowflakeに変換するための翻訳仕様

説明

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 UPPER(RTRIM(IFNULL(CHECK_JSON('{}'), 'OK'))) = UPPER(RTRIM('OK'))
THEN 'OKK' ELSE 'NOT OK'
END;
Copy

既知の問題

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

関連 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)
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_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 [,...])]
)

Copy

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"}
]
}'));
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 AI では常に省略されます。

サンプルソースパターン

文字列データを含む 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"}

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

既知の問題

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

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

2.BINARY データを含む JSON はサポートされていません

Snowflakeは、バイナリデータを解析して JSON の値を作成することをサポートしていません。SnowConvert AI がバイナリデータを持つ 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 AI で自動的に行うことができますが、区切り文字の値がリテラル文字列である場合に限ります。そうでない場合は、バックスラッシュをエスケープできず、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はperiodデータ型をサポートしておらず、すべてのperiodは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はperiodデータ型をサポートしておらず、すべてのperiodはvarcharとして処理されます

PIVOT

TeradataからSnowflakeへの 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 AI は、PIVOT 関数をSnowflakeのPIVOT 関数に変換しています。この関数は、単一の列に対する関数の適用のみをサポートしています。

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

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

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

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

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

エイリアスを持つ列名が同等であるためには、SnowConvert AI では、IN 句で指定されたすべての値に1つのエイリアスが指定され、入力コードにテーブル仕様が存在する必要があります。これは、SnowConvert AI が結果のテーブルのエイリアスリストを正常に作成するために必要です。

関連 EWIs

  1. SSC-EWI-0015:入力のpivot/unpivot ステートメント形式はサポートされていません

RANK

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

  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

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

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 にセットされている場合、ユーザーはサポートされていないことを警告されます。

  1. 関数を正しく変換するには、テーブル情報が必要です

SnowConvert AI では、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 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');
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 はありません。

CAST

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

Teradataはvarcharにキャストする際、各数値データ型にデフォルトのフォーマットを使用するため、SnowConvert AI はプラットフォーム間で等価性を保つためにフォーマットを追加します。

サンプルソースパターン

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"

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"    

既知の問題

  • 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はインターバルデータ型をサポートしていませんが、DateTime 操作で使用できる INTERVAL 定数があり、その他の用途は VARCHAR を使用してエミュレートできます。SnowConvert AI は、INTERVAL データ型に対するCAST 関数を、ケースに応じて同等のものに変換します。

  • キャストされる値が間隔型の場合、新しい間隔に相当する文字列を生成するために 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 はありません。