SnowConvert: Teradata組み込み関数¶
注釈
このページでは、SnowConvert で既に変換されている関数のみをリストしています。Teradataドキュメントの関数がここにリストされていない場合は、サポートされていないものとお考えください。
注釈
Teradata関数の中には、Snowflakeで直接等価なものがないため、機能的に等価な UDF に変換されるものがあります。これらは、関数名の中の_UDF という接尾辞で簡単に見つけることができます。UDFs SnowConvert の使用に関する詳細情報は、この gitリポジトリ をチェックしてください。
集計関数¶
Teradata |
Snowflake |
注意 |
---|---|---|
AVG |
AVG |
|
CORR |
CORR |
|
COUNT |
COUNT |
|
COVAR_POP |
COVAR_POP |
|
COVAR_SAMP |
COVAR_SAMP |
|
GROUPING |
GROUPING |
|
KURTOSIS |
KURTOSIS |
|
MAXIMUM MAX |
MAX |
|
MINIMUM MIN |
MIN |
|
PIVOT |
PIVOT |
PIVOTをチェックしてください。 |
REGR_AVGX |
REGR_AVGX |
|
REGR_AVGY |
REGR_AVGY |
|
REGR_COUNT |
REGR_COUNT |
|
REGR_INTERCEPT |
REGR_INTERCEPT |
|
REGR_R2 |
REGR_R2 |
|
REGR_SLOPE |
REGR_SLOPE |
|
REGR_SXX |
REGR_SXX |
|
REGR_SXY |
REGR_SXY |
|
REGR_SYY |
REGR_SYY |
|
SKEW |
SKEW |
|
STDDEV_POP |
STDDEV_POP |
|
STDDEV_SAMP |
STDDEV_SAMP |
|
SUM |
SUM |
|
UNPIVOT |
UNPIVOT |
<p>複数関数によるピボット解除<br>はSnowflakeではサポートされていません</p> |
VAR_POP |
VAR_POP |
|
VAR_SAMP |
VAR_SAMP |
集計関数を参照してください
算術、三角、双曲線演算子/関数¶
Teradata |
Snowflake |
注意 |
---|---|---|
ABS |
ABS |
|
CEILING |
CEIL |
|
DEGREES |
DEGREES |
|
EXP |
EXP |
|
FLOOR |
FLOOR |
|
HYPERBOLIC ACOSH ASINH ATANH COSH SINH TANH |
HYPERBOLIC ACOSH ASINH ATANH COSH SINH TANH |
|
LOG |
LOG |
|
LN |
LN |
|
MOD |
MOD |
|
NULLIFZERO(param) |
CASE WHEN param=0 THEN null ELSE param END |
|
POWER |
POWER |
|
RANDOM |
RANDOM |
|
RADIANS |
RADIANS |
|
ROUND |
ROUND |
|
SIGN |
SIGN |
|
SQRT |
SQRT |
|
TRUNC |
TRUNC_UDF |
|
TRIGONOMETRIC ACOS ASIN ATAN ATAN2 COS SIN TAN |
TRIGONOMETRIC ACOS ASIN ATAN ATAN2 COS SIN TAN |
|
ZEROIFNULL |
ZEROIFNULL |
算術、三角、双曲線演算子/関数 を参照してください
属性関数¶
Teradata |
Snowflake |
注意 |
---|---|---|
BIT_LENGTH |
BIT_LENGTH |
|
BYTE BYTES |
LENGTH |
|
CHAR CHARS CHARACTERS |
LEN |
|
CHAR_LENGTH CHARACTER_LENGTH |
LEN |
|
MCHARACTERS |
LENGTH |
|
OCTECT_LENGTH |
OCTECT_LENGTH |
属性関数 を参照してください
ビット/バイト操作関数¶
Teradata |
Snowflake |
注意 |
---|---|---|
BITAND |
BITAND |
|
BITNOT |
BITNOT |
|
BITOR |
BITOR |
|
BITXOR |
BITXOR |
|
GETBIT |
GETBIT |
ビット/バイト関数 を参照してください
組み込み(システム関数)¶
Teradata |
Snowflake |
注意 |
---|---|---|
ACCOUNT |
CURRENT_ACCOUNT |
|
CURRENT_DATE CURDATE |
CURRENT_DATE |
|
CURRENT_ROLE |
CURRENT_ROLE |
|
CURRENT_TIME |
CURRENT_TIME |
|
CURRENT_TIMESTAMP |
CURRENT_TIMESTAMP |
|
DATABASE |
CURRENT_DATABASE |
|
DATE |
CURRENT_DATE |
|
NOW |
CURRENT_TIMESTAMP |
|
PROFILE |
CURRENT_ROLE |
|
SESSION |
CURRENT_SESSION |
|
TIME |
CURRENT_TIME |
|
USER |
CURRENT_USER |
組み込み関数 を参照してください
ビジネスカレンダー¶
Teradata |
Snowflake |
注意 |
---|---|---|
DAYNUMBER_OF_MONTH(DatetimeValue, 'COMPATIBLE') |
DAYOFMONTH |
|
DAYNUMBER_OF_MONTH(DatetimeValue, 'ISO') |
DAYNUMBER_OF_MONTH_ISO_UDF |
|
DAYNUMBER_OF_MONTH(DatetimeValue, 'TERADATA') |
DAYOFMONTH |
|
DAYNUMBER_OF_WEEK(DatetimeValue, 'ISO') |
DAYOFWEEKISO |
|
DAYNUMBER_OF_WEEK(DatetimeValue, 'COMPATIBLE') |
DAY_OF_WEEK_COMPATIBLE_UDF |
|
DAYNUMBER_OF_WEEK(DatetimeValue, 'TERADATA') |
TD_DAY_OF_WEEK_UDF |
|
DAYNUMBER_OF_YEAR(DatetimeValue, 'ISO') |
PUBLIC.DAY_OF_YEAR_ISO_UDF |
|
DAYNUMBER_OF_YEAR(DatetimeValue) |
DAYOFYEAR |
|
QUARTERNUMBER_OF_YEAR |
QUARTER |
|
TD_SUNDAY(DateTimeValue) |
PREVIOUS_DAY(DateTimeValue, '日曜日') |
|
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 によって変換される 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を返します。
既知の問題¶
問題は見つかりませんでした。
Numberデータ型からVarcharデータ型へのキャスト¶
Teradataがvarcharにキャストする際、各数値データ型のデフォルト形式を使用するため、Snowconvertはプラットフォーム間の等価性を保つために形式を追加します。
サンプルソースパターン¶
BYTEINT¶
Teradata¶
SELECT '"'||cast(cast(12 as BYTEINT) as varchar(10))||'"';
(('"'||12)||'"')|
----------------+
"12" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(cast(12 as BYTEINT), 'TM'), 10) ||'"';
"'""'|| LEFT(TO_VARCHAR(CAST(12 AS BYTEINT), 'TM'), 10) ||'""'"
---------------------------------------------------------------
"12"
SMALLINT¶
Teradata¶
SELECT '"'||cast(cast(123 as SMALLINT) as varchar(10))||'"';
(('"'||123)||'"')|
-----------------+
"123" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'"';
"'""'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"123"
INTEGER¶
Teradata¶
SELECT '"'||cast(cast(12345 as INTEGER) as varchar(10))||'"';
(('"'||12345)||'"')|
-------------------+
"12345" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'"';
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'""'"
------------------------------------------------------------------
"12345"
BIGINT¶
Teradata¶
SELECT '"'||cast(cast(12345 as BIGINT) as varchar(10))||'"';
(('"'||12345)||'"')|
-------------------+
"12345" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'"';
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"12345"
DECIMAL[(n[,m])]または NUMERIC[(n[,m])]¶
Teradata¶
SELECT '"'||cast(cast(12345 as DECIMAL) as varchar(10))||'"',
'"'||cast(cast(12345 as DECIMAL(12, 2)) as varchar(10))||'"';
(('"'||12345)||'"')|(('"'||12345)||'"')|
-------------------+-------------------+
"12345." |"12345.00" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL), 'TM.'), 10) ||'"',
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL(12, 2)), 'TM'), 10) ||'"';
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL), 'TM.'), 10) ||'"' '"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL(12, 2)), 'TM'), 10) ||'"'
"12345." "12345.00"
既知の問題¶
Teradataは0から1までの数値をSnowflakeとは異なる方法で扱います。これらの値に対して、Teradataはドットの前にゼロを追加しませんが、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はIntervalデータ型をサポートしていませんが、DateTime の操作で使用できる INTERVAL 定数があり、その他の用途は VARCHAR を使用してエミュレートできます。SnowConvert は CAST 関数をケースに応じて等価な INTERVAL データ型に変換します。
キャストされる値が間隔型の場合、新しい間隔に相当する文字列を生成するために UDF が生成されます
値がリテラルである場合、キャストがdatetime操作で使用される場合はSnowflake間隔定数が生成され、そうでない場合はリテラル文字列が生成されます
値がリテラルでない場合、文字列へのキャストが生成されます
サンプルソースパターン¶
非間隔リテラル¶
Teradata¶
SELECT TIMESTAMP '2022-10-15 10:30:00' + CAST ('12:34:56.78' AS INTERVAL HOUR(2) TO SECOND(2)) AS VARCHAR_TO_INTERVAL,
TIMESTAMP '2022-10-15 10:30:00' + CAST(-5 AS INTERVAL YEAR(4)) AS NUMBER_TO_INTERVAL,
CAST('07:00' AS INTERVAL HOUR(2) TO MINUTE) AS OUTSIDE_DATETIME_OPERATION;
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 はありません。
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¶
説明¶
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 関数は、クエリバンド内の名前キーを検索し、関連付けられている値が存在する場合はそれを返します。トランザクション、セッション、プロファイル、またはクエリバンドのキーと値のペアの内部を検索するために使用できます。
この関数の詳細情報については、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 IFNULL(CHECK_JSON('{}'), 'OK') = 'OK'
THEN 'OKK' ELSE 'NOT OK'
END;
既知の問題¶
問題は見つかりませんでした。
関連 EWIs ¶
関連 EWIs はありません。
JSON_EXTRACT¶
説明¶
Teradataのドキュメントによると、これらの関数は JSONPath クエリ構文 を使用して、JSON インスタンスの一部に関する情報をリクエストします。希望するエンティティは、名前/値のペア、オブジェクト、配列、配列要素、値など、JSON インスタンスのどの部分でもかまいません。
Teradata JSONExtractValue、JSONExtractLargeValue、JSONExtract に関する情報は、こちら をご覧ください。
JSON_expr.JSONExtractValue(JSONPath_expr)
JSON_expr.JSONExtractLargeValue(JSONPath_expr)
JSON_expr.JSONExtract(JSONPath_expr)
JSON_EXTRACT_UDF は、 Stefan Goessner が開発したオリジナルの JavaScript 実装の修正バージョンを使用した、 JSONPath 仕様のSnowflake実装です。
サンプルソースパターン¶
Teradata¶
SELECT
Store.JSONExtract('$..author') as AllAuthors,
Store.JSONExtractValue('$..book[2].title') as ThirdBookTitle,
Store.JSONExtractLargeValue('$..book[2].price') as ThirdBookPrice
FROM BookStores;
Snowflakeスクリプト¶
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 ドキュメントの内容に基づいてテーブルを作成します。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は列が正しいタイプであると仮定し、変換に使用します。
サンプルソースパターン¶
セットアップデータ¶
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 では常に省略されます。
サンプルソースパターン¶
文字列データを含む 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 がバイナリデータを持つ 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.スペースを含む区切り文字(\)は、Snowflakeでバックスラッシュをスケープする必要があります
Teradataでは、スペースを含む区切り文字は「\ 」を使用して指定します(区切り文字にスペースを含む NVPを参照してください)。例に示すように、Teradataではバックスラッシュをエスケープする必要はありませんが、Snowflakeでは必要です。区切り文字内のバックスラッシュのエスケープは、SnowConvert によって自動的に行うことができますが、区切り文字の値がリテラル文字列の場合のみ行われます。それ以外の場合は、バックスラッシュをエスケープできなかったため、Snowflakeで異なる結果が生じる可能性があることをユーザーに警告します。
関連 EWIs¶
SSC-FDM-TD0008: スペースを含むリテラルでない区切り文字はSnowflakeでバックスラッシュをスケープする必要があります。
OVERLAPS¶
説明¶
Teradataのドキュメントによると、OVERLAPS 演算子は2つ以上の期間式を比較します。重複している場合はtrueを返します。
Teradataの OVERLAPS に関する情報は こちら をご覧ください。
period_expression
OVERLAPS
period_expression
PERIOD_OVERLAPS_UDF は、Teradataの OVERLAPS 演算子をSnowflakeで実装したものです。
サンプルソースパターン¶
Teradata¶
SELECT
PERIOD(DATE '2009-01-01', DATE '2010-09-24')
OVERLAPS
PERIOD(DATE '2009-02-01', DATE '2009-06-24');
Snowflakeスクリプト¶
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は期間データ型をサポートしていないため、すべての期間は代わりに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は期間データ型をサポートしていないため、すべての期間は代わりにvarcharとして処理されます
PIVOT¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
ピボット関数は、テーブルの行を列に変換するために使用します。詳細は、 PIVOT Teradataドキュメント をご参照ください。
PIVOT ( pivot_spec )
[ WITH with_spec [,...] ]
[AS] derived_table_name [ ( cname [,...] ) ]
pivot_spec := aggr_fn_spec [,...] FOR for_spec
aggr_fn_spec := aggr_fn ( cname ) [ [AS] pvt_aggr_alias ]
for_spec := { cname IN ( expr_spec_1 [,...] ) |
( cname [,...] ) IN ( expr_spec_2 [,...] ) |
cname IN ( subquery )
}
expr_spec_1 := expr [ [AS] expr_alias_name ]
expr_spec_2 := ( expr [,...] ) [ [AS] expr_alias_name ]
with_spec := aggr_fn ( { cname [,...] | * } ) [AS] aggr_alias
サンプルソースパターン¶
セットアップデータ¶
Teradata¶
CREATE TABLE star1(
country VARCHAR(20),
state VARCHAR(10),
yr INTEGER,
qtr VARCHAR(3),
sales INTEGER,
cogs INTEGER
);
insert into star1 values ('USA', 'CA', 2001, 'Q1', 30, 15);
insert into star1 values ('Canada', 'ON', 2001, 'Q2', 10, 0);
insert into star1 values ('Canada', 'BC', 2001, 'Q3', 10, 0);
insert into star1 values ('USA', 'NY', 2001, 'Q1', 45, 25);
insert into star1 values ('USA', 'CA', 2001, 'Q2', 50, 20);
Snowflake¶
CREATE OR REPLACE TABLE star1 (
country VARCHAR(20),
state VARCHAR(10),
yr INTEGER,
qtr VARCHAR(3),
sales INTEGER,
cogs INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO star1
VALUES ('USA', 'CA', 2001, 'Q1', 30, 15);
INSERT INTO star1
VALUES ('Canada', 'ON', 2001, 'Q2', 10, 0);
INSERT INTO star1
VALUES ('Canada', 'BC', 2001, 'Q3', 10, 0);
INSERT INTO star1
VALUES ('USA', 'NY', 2001, 'Q1', 45, 25);
INSERT INTO star1
VALUES ('USA', 'CA', 2001, 'Q2', 50, 20);
基本的な PIVOT 変換¶
Teradata¶
SELECT *
FROM star1 PIVOT (
SUM(sales) FOR qtr
IN ('Q1',
'Q2',
'Q3')
)Tmp;
Country | State | yr | cogs | 'Q1' | 'Q2' | 'Q3' |
--------+-------+------+------+------+------+------+
Canada | BC | 2001 | 0 | null | null | 10 |
--------+-------+------+------+------+------+------+
USA | NY | 2001 | 25 | 45 | null | null |
--------+-------+------+------+------+------+------+
Canada | ON | 2001 | 0 | null | 10 | null |
--------+-------+------+------+------+------+------+
USA | CA | 2001 | 20 | null | 50 | null |
--------+-------+------+------+------+------+------+
USA | CA | 2001 | 15 | 30 | null | null |
--------+-------+------+------+------+------+------+
Snowflake¶
SELECT
*
FROM
star1 PIVOT(
SUM(sales) FOR qtr IN ('Q1',
'Q2',
'Q3'))Tmp;
Country | State | yr | cogs | 'Q1' | 'Q2' | 'Q3' |
--------+-------+------+------+------+------+------+
Canada | BC | 2001 | 0 | null | null | 10 |
--------+-------+------+------+------+------+------+
USA | NY | 2001 | 25 | 45 | null | null |
--------+-------+------+------+------+------+------+
Canada | ON | 2001 | 0 | null | 10 | null |
--------+-------+------+------+------+------+------+
USA | CA | 2001 | 20 | null | 50 | null |
--------+-------+------+------+------+------+------+
USA | CA | 2001 | 15 | 30 | null | null |
--------+-------+------+------+------+------+------+
エイリアス変換を含む PIVOT¶
Teradata¶
SELECT *
FROM star1 PIVOT (
SUM(sales) as ss1 FOR qtr
IN ('Q1' AS Quarter1,
'Q2' AS Quarter2,
'Q3' AS Quarter3)
)Tmp;
Country | State | yr | cogs | Quarter1_ss1 | Quarter2_ss1 | Quarter3_ss1 |
--------+-------+------+------+--------------+--------------+--------------+
Canada | BC | 2001 | 0 | null | null | 10 |
--------+-------+------+------+--------------+--------------+--------------+
USA | NY | 2001 | 25 | 45 | null | null |
--------+-------+------+------+--------------+--------------+--------------+
Canada | ON | 2001 | 0 | null | 10 | null |
--------+-------+------+------+--------------+--------------+--------------+
USA | CA | 2001 | 20 | null | 50 | null |
--------+-------+------+------+--------------+--------------+--------------+
USA | CA | 2001 | 15 | 30 | null | null |
--------+-------+------+------+--------------+--------------+--------------+
Snowflake¶
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
star1 PIVOT(
SUM(sales) FOR qtr IN (
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
'Q1',
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
'Q2',
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
'Q3'))Tmp;
Country | State | yr | cogs | Quarter1_ss1 | Quarter2_ss1 | Quarter3_ss1 |
--------+-------+------+------+--------------+--------------+--------------+
Canada | BC | 2001 | 0 | null | null | 10 |
--------+-------+------+------+--------------+--------------+--------------+
USA | NY | 2001 | 25 | 45 | null | null |
--------+-------+------+------+--------------+--------------+--------------+
Canada | ON | 2001 | 0 | null | 10 | null |
--------+-------+------+------+--------------+--------------+--------------+
USA | CA | 2001 | 20 | null | 50 | null |
--------+-------+------+------+--------------+--------------+--------------+
USA | CA | 2001 | 15 | 30 | null | null |
--------+-------+------+------+--------------+--------------+--------------+
既知の問題¶
1.WITH 句はサポートされていません
WITH 句の使用は現在サポートされていません。
2.複数のピボット列でのピボットはサポートされていません
Snowconvertは PIVOT 関数をSnowflakeの PIVOT 関数に変換しています。Snowflakeは関数を単一の列に対してのみ適用することをサポートしています。
3.複数の集計関数によるピボットはサポートされていません
Snowflakeの PIVOT 関数は、データに対して1つの集計関数の適用しかサポートしていません。
4.IN 句のサブクエリはサポートされていません
Snowflake PIVOT 関数の IN 句はサブクエリを受け付けません。
5.エイリアスは、すべての IN 句要素にエイリアスがあり、テーブル指定が存在する場合にのみサポートされます
エイリアスを持つ列名が等価であるためには、 SnowConvert は、IN 句で指定されたすべての値に1つのエイリアスが指定されていて、入力コードにテーブル指定が存在することを必要とします。これは、SnowConvert が結果のテーブルのエイリアスリストを正常に作成できるようにするために必要です。
関連 EWIs¶
SSC-EWI-0015: 入力ピボット/アンピボットステートメント形式はサポートされていません
RANK¶
説明¶
RANK は結果セットをソートし、結果の各行の順位を数値で識別します。RANK の引数はソート列のみで、関数は結果の各行の順位を表す整数を返します。(Teradataの RANK)
Teradata構文¶
RANK ( sort_expression [ ASC | DESC ] [,...] )
Snowflake構文¶
RANK() OVER
(
[ PARTITION BY <expr1> ]
ORDER BY <expr2> [ { ASC | DESC } ]
[ <window_frame> ]
)
サンプルソースパターン¶
セットアップデータ¶
Teradata¶
CREATE TABLE Sales (
Product VARCHAR(255),
Sales INT
);
INSERT INTO Sales (Product, Sales) VALUES ('A', 100);
INSERT INTO Sales (Product, Sales) VALUES ('B', 150);
INSERT INTO Sales (Product, Sales) VALUES ('C', 200);
INSERT INTO Sales (Product, Sales) VALUES ('D', 150);
INSERT INTO Sales (Product, Sales) VALUES ('E', 120);
INSERT INTO Sales (Product, Sales) VALUES ('F', NULL);
Snowflake¶
CREATE OR REPLACE TABLE Sales (
Product VARCHAR(255),
Sales INT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO Sales (Product, Sales)
VALUES ('A', 100);
INSERT INTO Sales (Product, Sales)
VALUES ('B', 150);
INSERT INTO Sales (Product, Sales)
VALUES ('C', 200);
INSERT INTO Sales (Product, Sales)
VALUES ('D', 150);
INSERT INTO Sales (Product, Sales)
VALUES ('E', 120);
INSERT INTO Sales (Product, Sales)
VALUES ('F', NULL);
ASC、 DESC、DEFAULT の順序を使用する RANK()¶
Teradata¶
警告
RANK()を呼び出す際のTeradataの順序付けデフォルト値は、 DESC であることに注意してください。ただし、Snowflakeのデフォルトは ASC です。したがって、 RANK()の変換では、順序が指定されていない場合、DESC が追加されます。
SELECT
Sales,
RANK(Sales ASC) AS SalesAsc,
RANK(Sales DESC) AS SalesDesc,
RANK(Sales) AS SalesDefault
FROM
Sales;
SALES | SALESASC | SALESDESC | SALESDEFAULT |
---|---|---|---|
NULL | 6 | 6 | 6 |
200 | 5 | 1 | 1 |
150 | 3 | 2 | 2 |
150 | 3 | 2 | 2 |
120 | 2 | 4 | 4 |
100 | 1 | 5 | 5 |
Snowflake¶
SELECT
Sales,
RANK() OVER (
ORDER BY
Sales ASC) AS SalesAsc,
RANK() OVER (
ORDER BY
Sales DESC NULLS LAST) AS SalesDesc,
RANK() OVER (
ORDER BY
Sales DESC NULLS LAST) AS SalesDefault
FROM
Sales;
SALES | SALESASC | SALESDESC | SALESDEFAULT |
---|---|---|---|
NULL | 6 | 6 | 6 |
200 | 5 | 1 | 1 |
150 | 3 | 2 | 2 |
150 | 3 | 2 | 2 |
120 | 2 | 4 | 4 |
100 | 1 | 5 | 5 |
既知の問題¶
問題は見つかりませんでした。
関連 EWIs ¶
関連 EWIs はありません。
正規表現関数¶
説明¶
TeradataもSnowflakeも、varchar入力に正規表現を適用する関数をサポートしています。詳細については、 Teradataドキュメント および Snowflakeドキュメント を参照してください。
REGEXP_SUBSTR(source. regexp [, position, occurrence, match])
REGEXP_REPLACE(source. regexp [, replace_string, position, occurrence, match])
REGEXP_INSTR(source. regexp [, position, occurrence, return_option, match])
REGEXP_SIMILAR(source. regexp [, match])
REGEXP_SPLIT_TO_TABLE(inKey. source. regexp, match)
サンプルソースパターン¶
セットアップデータ¶
Teradata¶
CREATE TABLE regexpTable
(
col1 CHAR(35)
);
INSERT INTO regexpTable VALUES('hola');
Snowflake¶
CREATE OR REPLACE TABLE regexpTable
(
col1 CHAR(35)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO regexpTable
VALUES ('hola');
正規表現変換の例¶
Teradata¶
SELECT
REGEXP_REPLACE(col1,'.*(h(i|o))','ha', 1, 0, 'x'),
REGEXP_SUBSTR(COL1,'.*(h(i|o))', 2, 1, 'x'),
REGEXP_INSTR(COL1,'.*(h(i|o))',1, 1, 0, 'x'),
REGEXP_SIMILAR(COL1,'.*(h(i|o))', 'xl')
FROM regexpTable;
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala |null |1 |0 |
Snowflake¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "regexpTable" **
SELECT
REGEXP_REPLACE(col1, '.*(h(i|o))', 'ha', 1, 0),
REGEXP_SUBSTR(COL1, '.*(h(i|o))', 2, 1),
REGEXP_INSTR(COL1, '.*(h(i|o))', 1, 1, 0),
--** SSC-FDM-TD0016 - VALUE 'l' FOR PARAMETER 'match_arg' IS NOT SUPPORTED IN SNOWFLAKE **
REGEXP_LIKE(COL1, '.*(h(i|o))')
FROM
regexpTable;
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala |null |1 |FALSE |
既知の問題¶
1.Snowflakeは POSIX 正規表現のみをサポートしています
SnowConvert が POSIX 以外の正規表現を見つけると、ユーザーに警告が表示されます。
2.Teradataの「match_arg」オプション「l」はSnowflakeでサポートされていません
オプション「l」はSnowflakeでは対応するものがなく、 SnowConvert が見つけるとユーザーに警告が表示されます。
3.CHAR データ型のサイズが固定されているため、動作が異なる場合があります
Teradataの正規表現関数の中には、テーブルの CHAR データ型の列全体にマッチさせようとするものがあります。たとえ、より小さい文字列が挿入されたために列の文字が空になっていたとしてもです。Snowflakeでは、 CHAR データ型が可変サイズであるため、このようなことは起こりません。
4.REGEXP_SPLIT_TO_TABLE はサポートされていません
この関数は現在Snowflakeではサポートされていません。
関連 EWIs¶
SSC-FDM-0007: 依存関係のない要素。
SSC-FDM-TD0016: パラメーター「match_arg」の値「l」がSnowflakeでサポートされていません。
STRTOK_SPLIT_TO_TABLE¶
説明¶
文字列を提供された区切り文字を使用してテーブルに分割します。詳細は STRTOK_SPLIT_TO_TABLE をご参照ください。
[TD_SYSFNLIB.] STRTOK_SPLIT_TO_TABLE ( inkey, instring, delimiters )
RETURNS ( outkey, tokennum, token )
サンプルソースパターン¶
セットアップデータ¶
Teradata¶
CREATE TABLE strtokTable
(
col1 INTEGER,
col2 VARCHAR(100)
);
INSERT INTO strtokTable VALUES(4, 'hello-world-split-me');
INSERT INTO strtokTable VALUES(1, 'string$split$by$dollars');
Snowflake¶
CREATE OR REPLACE TABLE strtokTable
(
col1 INTEGER,
col2 VARCHAR(100)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO strtokTable
VALUES (4, 'hello-world-split-me');
INSERT INTO strtokTable
VALUES (1, 'string$split$by$dollars');
STRTOK_SPLIT_TO_TABLE 変換¶
Teradata¶
SELECT outkey, tokennum, token FROM table(STRTOK_SPLIT_TO_TABLE(strtokTable.col1, strtokTable.col2, '-$')
RETURNS (outkey INTEGER, tokennum INTEGER, token VARCHAR(100))) AS testTable
ORDER BY outkey, tokennum;
outkey |tokennum | token |
-------+---------+--------+
1 |1 |string |
-------+---------+--------+
1 |2 |split |
-------+---------+--------+
1 |3 |by |
-------+---------+--------+
1 |4 |dollars |
-------+---------+--------+
4 |1 |hello |
-------+---------+--------+
4 |2 |world |
-------+---------+--------+
4 |3 |split |
-------+---------+--------+
4 |4 |me |
Snowflake¶
SELECT
CAST(strtokTable.col1 AS INTEGER) AS outkey,
CAST(INDEX AS INTEGER) AS tokennum,
CAST(VALUE AS VARCHAR) AS token
FROM
strtokTable,
table(STRTOK_SPLIT_TO_TABLE(strtokTable.col2, '-$')) AS testTable
ORDER BY outkey, tokennum;
outkey |tokennum | token |
-------+---------+--------+
1 |1 |string |
-------+---------+--------+
1 |2 |split |
-------+---------+--------+
1 |3 |by |
-------+---------+--------+
1 |4 |dollars |
-------+---------+--------+
4 |1 |hello |
-------+---------+--------+
4 |2 |world |
-------+---------+--------+
4 |3 |split |
-------+---------+--------+
4 |4 |me |
既知の問題¶
既知の問題はありません。
関連 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¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
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 には、 TD_UNPIVOT 関数で使用されている列の名前が必要です。ユーザーが関数のquery_expressionに列リストを含めず、アンピボットするテーブルの名前を指定した場合、テーブル定義から列名を取得しようとします。もし名前が見つからない場合、クエリ結果で列が失われる可能性があることをユーザーに警告します。
関連 EWIs¶
SSC-EWI-TD0061: TD_UNPIVOT 変換には列情報が必要ですが、見つからないため、結果に列がありません。
TO_CHAR¶
説明¶
TO_CHAR 関数は、 DateTime または数値を文字列にキャストします。詳細は TO_CHAR(Numeric)および TO_CHAR(DateTime) をご参照ください。
-- Numeric version
[TD_SYSFNLIB.]TO_CHAR(numeric_expr [, format_arg [, nls_param]])
-- DateTime version
[TD_SYSFNLIB.]TO_CHAR(dateTime_expr [, format_arg])
SnowflakeとTeradataは、それぞれ独自のバージョンの TO_CHAR 関数を持っていますが、TeradataはSnowflakeがネイティブにサポートしていない形式をたくさんサポートしています。これらの形式要素をサポートするために、 SnowConvert はSnowflake組み込み関数とカスタム UDFs を使用して、Teradataの元の TO_CHAR 関数と同じ文字列を生成する連結式を生成します。
サンプルソースパターン¶
TO_CHAR(DateTime)変換¶
Teradata¶
SELECT
TO_CHAR(date '2012-12-23'),
TO_CHAR(date '2012-12-23', 'DS'),
TO_CHAR(date '2012-12-23', 'DAY DD, MON YY');
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
Snowflake¶
SELECT
TO_CHAR(date '2012-12-23') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
TO_CHAR(date '2012-12-23', 'MM/DD/YYYY') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
PUBLIC.DAYNAME_LONG_UDF(date '2012-12-23', 'uppercase') || TO_CHAR(date '2012-12-23', ' DD, ') || PUBLIC.MONTH_SHORT_UDF(date '2012-12-23', 'uppercase') || TO_CHAR(date '2012-12-23', ' YY') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
TO_CHAR(Numeric)変換¶
Teradata¶
SELECT
TO_CHAR(1255.495),
TO_CHAR(1255.495, '9.9EEEE'),
TO_CHAR(1255.495, 'SC9999.9999', 'nls_iso_currency = ''EUR''');
COLUMN1 | COLUMN2 | COLUMN3 |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |
Snowflake¶
SELECT
TO_CHAR(1255.495) /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
TO_CHAR(1255.495, '9.0EEEE') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
PUBLIC.INSERT_CURRENCY_UDF(TO_CHAR(1255.495, 'S9999.0000'), 2, 'EUR') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;
COLUMN1 | COLUMN2 | COLUMN3 |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |
既知の問題¶
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 はありません。