SnowConvert : Fonctions intégrées de Teradata¶
Note
Cette page ne liste que les fonctions déjà transformées par SnowConvert, si une fonction de la documentation de Teradata n’est pas listée, il faut considérer qu’elle n’est pas prise en charge.
Note
Certaines fonctions Teradata n’ont pas d’équivalent direct dans Snowflake et sont donc transformées en une UDF d’équivalence fonctionnelle, facilement repérable par le suffixe _UDF dans le nom de la fonction. Pour plus d’informations sur l’utilisation des UDFs SnowConvert, consultez ce référentiel git.
Fonctions d’agrégation¶
Teradata |
Snowflake |
Remarque |
---|---|---|
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 |
Consultez 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>Unpivot avec plusieurs fonctions<br>non pris en charge dans Snowflake</p> |
VAR_POP |
VAR_POP |
|
VAR_SAMP |
VAR_SAMP |
Voir Fonctions agrégées
Opérateurs/fonctions arithmétiques, trigonométriques et hyperboliques¶
Teradata |
Snowflake |
Remarque |
---|---|---|
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 |
Voir Opérateurs/fonctions arithmétiques, trigonométriques, hyperboliques
Fonctions des attributs¶
Teradata |
Snowflake |
Remarque |
---|---|---|
BIT_LENGTH |
BIT_LENGTH |
|
BYTE BYTES |
LENGTH |
|
CHAR CHARS CHARACTERS |
LEN |
|
CHAR_LENGTH CHARACTER_LENGTH |
LEN |
|
MCHARACTERS |
LENGTH |
|
OCTECT_LENGTH |
OCTECT_LENGTH |
Fonctions de manipulation des bits/octets¶
Teradata |
Snowflake |
Remarque |
---|---|---|
BITAND |
BITAND |
|
BITNOT |
BITNOT |
|
BITOR |
BITOR |
|
BITXOR |
BITXOR |
|
GETBIT |
GETBIT |
Intégré (fonctions du système)¶
Teradata |
Snowflake |
Remarque |
---|---|---|
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 |
Voir Fonctions intégrées
Calendriers d’entreprise¶
Teradata |
Snowflake |
Remarque |
---|---|---|
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, “Sunday”) |
|
WEEKNUMBER_OF_MONTH |
WEEKNUMBER_OF_MONTH_UDF |
|
WEEKNUMBER_OF_QUARTER(dateTimeValue) |
WEEKNUMBER_OF_QUARTER_UDF |
|
WEEKNUMBER_OF_QUARTER(dateTimeValue, “ISO”) |
WEEKNUMBER_OF_QUARTER_ISO_UDF |
|
WEEKNUMBER_OF_QUARTER(dateTimeValue, “COMPATIBLE”) |
WEEKNUMBER_OF_QUARTER_COMPATIBLE_UDF |
|
WEEKNUMBER_OF_YEAR(DateTimeValue, “ISO”) |
WEEKISO |
|
YEARNUMBER_OF_CALENDAR(DATETIMEVALUE, “COMPATIBLE”) |
YEAR |
|
YEARNUMBER_OF_CALENDAR(DATETIMEVALUE, “ISO”) |
YEAROFWEEKISO |
Voir les Calendriers d’entreprise
Fonctions du calendrier¶
Teradata |
Snowflake |
Remarque |
---|---|---|
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) |
Fonctions de casse¶
Teradata |
Snowflake |
Remarque |
---|---|---|
COALESCE |
COALESCE |
Consultez Coalesce. |
NULLIF |
NULLIF |
Voir Fonctions de casse
Fonctions de comparaison¶
Teradata |
Snowflake |
Remarque |
---|---|---|
DECODE |
DECODE |
|
GREATEST |
GREATEST |
|
LEAST |
LEAST |
Conversions de types de données¶
Teradata |
Snowflake |
Remarque |
---|---|---|
CAST |
CAST |
|
CAST(DatetimeValue AS INT) |
DATE_TO_INT_UDF |
|
CAST (VarcharValue AS INTERVAL) |
INTERVAL_UDF |
|
TRYCAST |
TRY_CAST |
|
FROM_BYTES |
TO_NUMBER |
FROM\BYTES avec le paramètre ASCII n’est pas pris en charge par Snowflake. |
Fonctions de conversion des types de données¶
Teradata |
Snowflake |
Remarque |
---|---|---|
TO_BYTES(Input, “Base10”) |
INT2HEX_UDF(Input) |
|
TO_NUMBER |
TO_NUMBER |
|
TO_CHAR |
TO_CHAR ou expression équivalente |
Consultez TO\_CHAR. |
TO_DATE |
TO_DATE |
|
TO_DATE(input, “YYYYDDD”) |
JULIAN_TO_DATE_UDF |
DateTime et fonctions d’intervalle¶
Teradata |
Snowflake |
Remarque |
---|---|---|
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 |
Fonctions de hachage¶
Teradata |
Snowflake |
Remarque |
---|---|---|
HASH_MD5 |
MD5 |
|
HASHAMP HASHBACKAM HASHBUCKET HASHROW |
Non pris en charge |
Consultez les notes sur les différences d’architecture entre Teradata et Snowflake |
Voir Fonctions de hachage
Fonctions JSON¶
Teradata |
Snowflake |
Remarque |
---|---|---|
NEW JSON |
TO_JSON(PARSE_JSON() ) |
Consultez NEW JSON |
JSON_CHECK |
CHECK_JSON |
Consultez JSON_CHECK |
JSON_TABLE |
Requête équivalente |
Consultez JSON_TABLE |
JSONExtract JSONExtractValue |
JSON_EXTRACT_UDF |
Consultez JSON_EXTRACT |
Voir Documentation JSON
Fonctions de traitement des nullités¶
Teradata |
Snowflake |
Remarque |
---|---|---|
NVL |
NVL |
|
NVL2 |
NVL2 |
Voir Fonctions de traitement des nullités
Fonctions analytiques ordonnées/fenêtres agrégées¶
Teradata |
Snowflake |
Remarque |
---|---|---|
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 |
Voir Fonctions de fenêtre
Fonctions et opérateurs de période¶
Teradata |
Snowflake |
Remarque |
---|---|---|
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”) |
Voir les notes sur constantes de borne de fin |
RDIFF |
PERIOD_RDIFF_UDF |
Fonctions de bande de requête¶
Teradata |
Snowflake |
Remarque |
---|---|---|
GETQUERYBANDVALUE |
GETQUERYBANDVALUE_UDF |
Consultez GETQUERYBANDVALUE |
Fonctions Regex¶
Teradata |
Snowflake |
Remarque |
---|---|---|
REGEXP_INSTR |
REGEXP_INSTR |
Consultez Fonctions Regex |
REGEXP_REPLACE |
REGEXP_REPLACE |
Consultez Fonctions Regex |
REGEXP_SIMILAR |
REGEXP_LIKE |
Consultez Fonctions Regex |
REGEXP_SUBSTR |
REGEXP_SUBSTR |
Consultez Fonctions Regex |
Voir Fonctions Regex
Opérateurs et fonctions sur les chaînes de caractères¶
Teradata |
Snowflake |
Remarque |
---|---|---|
ASCII |
ASCII |
|
CHAR2HEXINT |
CHAR2HEXINT_UDF |
|
CHR |
CHR/CHAR |
|
CHAR_LENGTH |
LEN |
|
CONCAT |
CONCAT |
|
EDITDISTANCE |
EDITDISTANCE |
|
INDEX |
CHARINDEX |
Consultez les notes concernant la conversion implicite |
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 |
Consultez les notes concernant la conversion implicite |
REVERSE |
REVERSE |
|
RIGHT |
RIGHT |
|
RPAD |
RPAD |
|
RTRIM |
RTRIM |
|
SOUNDEX |
SOUNDEX_P123 |
|
STRTOK |
STRTOK |
|
STRTOK_SPLIT_TO_TABLE |
STRTOK_SPLIT_TO_TABLE |
Consultez Strtok_split_to_table |
SUBSTRING |
SUBSTR/SUBSTR_UDF |
Consultez Sous-chaîne |
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 |
Fonctions St_Point¶
Teradata |
Snowflake |
Remarque |
---|---|---|
ST_SPHERICALDISTANCE |
HAVERSINE |
Voir Fonctions St_Point
Opérateurs de table¶
Teradata |
Snowflake |
Remarque |
---|---|---|
TD_UNPIVOT |
Requête équivalente |
Consultez Td_unpivot |
Voir Opérateurs de table
Fonctions XML¶
Teradata |
Snowflake |
Remarque |
---|---|---|
XMLAGG |
LISTAGG |
Consultez Xmlagg |
XMLQUERY |
Non pris en charge |
Voir Fonctions XML
UDFs d’extensibilité¶
Cette section contient des UDFs et d’autres fonctions d’extension qui ne sont pas proposées par Teradata en tant que fonctions intégrées au système, mais qui sont transformées par SnowConvert
Teradata |
Snowflake |
Remarque |
---|---|---|
CHKNUM |
CHKNUM_UDF |
Consultez cette page de téléchargement d’UDF |
Remarques¶
Différences d’architecture entre Teradata et Snowflake¶
Teradata utilise une architecture sans partage avec des AMP (Access Module Processors) où chaque AMP gère sa propre part de stockage sur disque et est accessible par hachage lors des requêtes. Pour tirer parti du parallélisme, les informations stockées doivent être réparties uniformément entre les AMPs. Pour ce faire, Teradata propose un groupe de fonctions liées au hachage qui peuvent être utilisées pour déterminer la qualité des index primaires actuels.
En revanche, l’architecture de Snowflake est différente et gère elle-même la manière dont les données sont stockées, ce qui signifie que les utilisateurs n’ont pas à se préoccuper de l’optimisation de la distribution de leurs données.
Constantes de bornes de fin (UNTIL_CHANGED et UNTIL_CLOSED)¶
UNTIL_CHANGED et UNTIL_CLOSED sont des constantes Teradata qui représentent une borne de fin non définie pour les périodes. En interne, ces constantes sont représentées par la valeur maximale que peut avoir un horodatage, c’est-à-dire « 9999-12-31 23:59:59.999999 ». Lors de la migration de la fonction PERIOD, la borne de fin est vérifiée pour déterminer s’il s’agit de l’une de ces constantes et pour la remplacer par un varchar de valeur « 9999-12-31 23:59:59.999999 ». Si c’est le cas, Snowflake convertit le varchar en date ou en horodatage, selon le type de la borne de début, lors de l’appel de la fonction PERIOD___UDF.
Conversion implicite¶
Certaines fonctions de chaîne de Teradata comme INDEX ou POSITION acceptent des types de données autres que des chaînes et les convertissent implicitement en chaînes, ce qui peut entraîner des incohérences dans les résultats de ces fonctions entre Teradata et Snowflake. Par exemple, regardez le code Teradata suivant :
SELECT INDEX(35, '5');
Renvoie 4, tandis que l’équivalent CHARINDEX dans Snowflake :
SELECT CHARINDEX('5', 35);
Renvoie 2, cela se produit parce que Teradata a ses propres formats par défaut qui sont utilisés lors de la conversion implicite. Dans l’exemple ci-dessus, Teradata interprète la constante numérique 35 comme BYTEINT et utilise le format par défaut BYTEINT'-999'
pour la conversion implicite en chaîne, ce qui donne la valeur convertie ' 35'
. D’autre part, Snowflake utilise ses propres formats par défaut, ce qui crée des incohérences dans le résultat.
Pour résoudre ce problème, les modifications suivantes sont apportées aux paramètres de ces fonctions :
Si le paramètre n’a pas de lien avec le format, une fonction Snowflake
TO_VARCHAR
avec l’équivalent du format Teradata par défaut dans Snowflake est ajoutée à la place.Si le paramètre est associé à un format, le format est converti en son équivalent Snowflake et la fonction
TO_VARCHAR
est ajoutée.Par ailleurs, Teradata ignore le signe d’un nombre s’il n’est pas explicitement placé dans un format, alors que Snowflake ajoute toujours des espaces pour insérer le signe même s’il n’est pas spécifié. Dans ces cas, une vérification est effectuée pour voir si le signe a été spécifié et pour le supprimer de la chaîne de Snowflake s’il ne l’a pas été.
Après ces modifications, le code résultant serait le suivant :
SELECT CHARINDEX( '5', TO_VARCHAR(35, 'MI999'));
Ce qui donne 4, le même résultat que le code Teradata.
Problèmes connus ¶
Aucun problème n’a été constaté.
Conversion des types de données Number en type de données Varchar¶
Teradata, lorsqu’il convertit en varchar, utilise des formats par défaut pour chaque type de données numériques. Snowconvert ajoute donc des formats pour maintenir l’équivalence entre les plateformes.
Modèles d’échantillons de sources¶
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])] ou 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"
Problèmes connus ¶
Teradata traite les nombres compris entre 0 et 1 différemment de Snowflake. Pour ces valeurs, Teradata n’ajoute pas le zéro avant le point, alors que Snowflake le fait.
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 connexes ¶
Pas d’EWIs connexes.
Conversion vers DATE avec { }¶
Description¶
La syntaxe suivante transforme une chaîne formatée en date en type de données DATE en plaçant un d devant la définition de la chaîne à l’intérieur d’accolades.
SELECT {d '1233-10-10'}
Modèles d’échantillons de sources¶
Conversion vers DATE avec des accolades¶
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');
Conversion en type de données INTERVAL¶
Description¶
Snowflake ne prend pas en charge le type de données d’intervalle, mais possède des constantes INTERVAL qui peuvent être utilisées dans les opérations DateTime et d’autres utilisations peuvent être émulées en utilisant VARCHAR, SnowConvert transformera les fonctions CAST vers le type de données INTERVAL en un équivalent selon le cas :
Lorsque la valeur à convertir est de type intervalle, une UDF est générée pour produire le nouvel équivalent d’intervalle sous la forme d’une chaîne
Lorsque la valeur est littérale, une constante d’intervalle Snowflake est générée si la valeur est utilisée dans une opération de datation, sinon une chaîne littérale est générée
Lorsque la valeur n’est pas littérale, une conversion en chaîne est générée
Modèles d’échantillons de sources¶
Littéraux sans intervalles¶
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 |
Valeurs non littérales et sans intervalles¶
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 |
Conversion d’un intervalle en un autre intervalle¶
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 |
Problèmes connus¶
Aucun problème connu.
EWIs connexes¶
Pas d’EWIs connexes.
COALESCE¶
Description¶
La fonction coalesce est utilisée pour renvoyer le premier élément non null d’une liste. Pour plus d’informations, voir COALESCE.
COALESCE(element_1, element_2 [, element_3, ..., element_n])
Les fonctions de Teradata et de Snowflake COALESCE permettent de mélanger des paramètres numériques avec des chaînes et des paramètres de date avec des horodatages. Cependant, ils traitent ces deux cas différemment :
Paramètres numériques et paramètres de type chaîne : Teradata convertit tous les paramètres numériques en varchar alors que Snowflake fait l’inverse
Horodatage et paramètres de date : Teradata convertit tous les horodatages en date alors que Snowflake fait l’inverse
Pour garantir l’équivalence fonctionnelle dans le premier cas, tous les paramètres numériques sont convertis en string
à l’aide de la fonction to_varchar
, qui prend en compte le format des nombres. Dans le second cas, tous les horodatages sont convertis en date à l’aide de to_date
, Teradata ignore le format des horodatages lorsqu’il les convertit, de sorte qu’il est supprimé lors de la transformation.
Modèles d’échantillons de sources¶
Paramètres numériques mélangés à des chaînes de caractères¶
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 |
Horodatage mélangé à des paramètres de date¶
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 |
Problèmes connus¶
Aucun problème connu_._
EWIs connexes¶
SSC-EWI-TD0025 : Le format de sortie n’est pas pris en charge.
CURRENT_TIMESTAMP¶
Gravité¶
Faible
Description¶
Les fractions de seconde ne sont affichées que si elles sont explicitement définies dans le paramètre de session TIME_OUTPUT_FORMAT.
Code d’entrée :¶
SELECT current_timestamp(4) at local;
Code de sortie :¶
SELECT
current_timestamp(4);
Recommandations¶
Vérifiez si le paramètre de session TIME_OUTPUT___FORMAT est défini pour obtenir le comportement que vous souhaitez.
Si vous avez encore besoin d’aide, vous pouvez nous envoyer un e-mail à l’adresse suivante : snowconvert-support@snowflake.com
Problèmes connus ¶
Aucun problème n’a été constaté.
EWIs connexes ¶
Pas d’EWIs connexes.
DAYNUMBER_OF_MONTH¶
Description¶
Renvoie le nombre de jours écoulés entre le début du mois et la date donnée. Pour plus d’informations, consultez DAYNUMBER_OF_MONTH.
DAYNUMBER_OF_MONTH(expression [, calendar_name])
Teradata et Snowflake traitent tous deux la fonction DAYNUMBER_OF_MONTH de la même manière, sauf dans un cas :
Le calendrier ISO : Un mois ISO compte 4 ou 5 semaines complètes. Pour plus d’informations, consultez À propos du calcul ISO.
Pour assurer l’équivalence fonctionnelle, une fonction définie par l’utilisateur (UDF) est ajoutée pour le cas du calendrier ISO.
Modèles d’échantillons de sources¶
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 |
Calendrier 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 |
Problèmes connus ¶
Aucun problème n’a été constaté.
EWIs connexes ¶
Pas d’EWIs connexes.
FROM_BYTES¶
Description¶
La fonction FROM_BYTES encode une séquence de bits en une séquence de caractères représentant son codage. Pour plus d’informations, consultez FROM_BYTES(Encodage).
Snowflake ne prend pas en charge la fonction FROM_BYTES, cependant, certains contournements peuvent être faits pour les occurrences les plus courantes de cette fonction.
Modèles d’échantillons de sources¶
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 |
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Problèmes connus¶
Le paramètre de format TO\NUMBER doit correspondre aux chiffres de la chaîne d’entrée.
Il n’existe pas de fonction intégrée équivalente sur le plan fonctionnel pour FROM_BYTES lors de l’encodage en ANSI
EWIs connexes¶
SSC-EWI-0031 : FUNCTION NOT SUPPORTED
GETQUERYBANDVALUE¶
Description¶
La fonction GetQueryBandValue recherche une clé de nom à l’intérieur de la bande de requête et renvoie sa valeur associée si elle est présente. Elle peut être utilisée pour effectuer une recherche dans la transaction, la session, le profil ou toute autre paire clé-valeur de la bande de requête.
Pour plus d’informations sur cette fonction, consultez GetQueryBandValue dans la documentation Teradata.
[SYSLIB.]GetQueryBandValue([QueryBandIn,] SearchType, Name);
Modèles d’échantillons de sources¶
Données de configuration¶
Teradata¶
SET QUERY_BAND = 'hola=hello;adios=bye;' FOR SESSION;
Snowflake¶
ALTER SESSION SET QUERY_TAG = 'hola=hello;adios=bye;';
GetQueryBandValue avec le paramètre QueryBandIn¶
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 | |
+----------+----------+----------+----------+----------+----------+
GetQueryBandValue sans le paramètre QueryBandIn¶
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 |
+----------+----------+
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Problèmes connus¶
1. GetQueryBandValue sans le paramètre QueryBandIn uniquement pris en charge pour la session
Teradata permet de définir des bandes de requête au niveau de la transaction, de la session ou du profil. Si GetQueryBandValue est appelé sans spécifier de bande de requête d’entrée, Teradata vérifiera automatiquement les bandes de requête de transaction, de session ou de profil en fonction de la valeur du paramètre SearchType.
Dans Snowflake, l’équivalent le plus proche des bandes de requête sont les balises de requête, qui peuvent être spécifiées pour la session, l’utilisateur et le compte.
En raison de ces différences, la mise en œuvre de GetQueryBandValue sans le paramètre QueryBandIn ne prend en compte que la balise de requête de session et peut ne pas fonctionner comme prévu pour d’autres types de recherche.
EWIs connexes¶
Pas d’EWIs connexes.
JSON_CHECK¶
Description¶
La fonction JSON_CHECK vérifie la validité d’une chaîne JSON.
Pour plus d’informations sur Teradata JSON_CHECK, cliquez ici.
[TD_SYSFNLIB.]JSON_CHECK(string_expr);
Modèle de source d’échantillon¶
Modèle source de base¶
Teradata¶
SELECT JSON_CHECK('{"key": "value"}');
Exécution de scripts Snowflake¶
SELECT
IFNULL(CHECK_JSON('{"key": "value"}'), 'OK');
JSON\CHECK à l’intérieur de la transformation CASE¶
Teradata¶
SELECT CASE WHEN JSON_CHECK('{}') = 'OK' then 'OKK' ELSE 'NOT OK' END;
Exécution de scripts Snowflake¶
SELECT
CASE
WHEN IFNULL(CHECK_JSON('{}'), 'OK') = 'OK'
THEN 'OKK' ELSE 'NOT OK'
END;
Problèmes connus ¶
Aucun problème n’a été constaté.
EWIs connexes ¶
Pas d’EWIs connexes.
JSON_EXTRACT¶
Description¶
Conformément à la documentation de Teradata, ces fonctions utilisent la syntaxe de requête JSONPath pour demander des informations sur une partie d’une instance JSON. L’entité souhaitée peut être n’importe quelle partie d’une instance JSON, comme une paire nom/valeur, un objet, un tableau, un élément de tableau ou une valeur.
Pour plus d’informations sur Teradata JSONExtractValue, JSONExtractLargeValue et JSONExtract, cliquez ici.
JSON_expr.JSONExtractValue(JSONPath_expr)
JSON_expr.JSONExtractLargeValue(JSONPath_expr)
JSON_expr.JSONExtract(JSONPath_expr)
Le site JSON_EXTRACT_UDF est une implémentation Snowflake de la spécification JSONPath qui utilise une version modifiée de l’implémentation originale JavaScript développée par Stefan Goessner.
Modèle de source d’échantillon¶
Teradata¶
SELECT
Store.JSONExtract('$..author') as AllAuthors,
Store.JSONExtractValue('$..book[2].title') as ThirdBookTitle,
Store.JSONExtractLargeValue('$..book[2].price') as ThirdBookPrice
FROM BookStores;
Exécution de scripts 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;
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Problèmes connus¶
1. Elements inside JSONs may not retain their original order.¶
Les éléments à l’intérieur d’un JSON sont classés par leurs clés lorsqu’ils sont insérés dans une table. Les résultats de la requête peuvent donc être différents. Toutefois, cela n’affecte pas l’ordre des tableaux à l’intérieur de JSON.
Par exemple, si le JSON original est :
{
"firstName":"Peter",
"lastName":"Andre",
"age":31,
"cities": ["Los Angeles", "Lima", "Buenos Aires"]
}
Utilisation de Snowflake PARSE_JSON() qui interprète une chaîne d’entrée comme un document JSON, produisant une valeur VARIANT. Le JSON inséré sera :
{
"age": 31,
"cities": ["Los Angeles", "Lima", "Buenos Aires"],
"firstName": "Peter",
"lastName": "Andre"
}
Notez que « âge » est désormais le premier élément. Toutefois, le tableau des « villes » conserve son ordre initial.
EWIs connexes¶
Pas d’EWIs connexes.
JSON_TABLE¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Description¶
Crée une table à partir du contenu d’un document JSON. Voir Documentation 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 [,...])]
)
La conversion de JSON_TABLE a les considérations indiquées ci-dessous :
ROW\NUMBER() est un équivalent des colonnes ordinales dans Snowflake.
Dans Teradata, la deuxième colonne de JSON_TABLE doit être de type JSON parce que les colonnes générées remplacent la deuxième colonne, pour cette raison, Snowconvert suppose que la colonne a le bon type, et l’utilise pour la transformation.
Modèles d’échantillons de sources¶
Données de configuration¶
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"}
]
}')));
Code du modèle 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 |
Problèmes connus¶
1. Le chemin JSON dans COLEXPR ne peut pas avoir plusieurs accès à l’astérisque
Les colonnes JSON chemin ne peuvent pas avoir plusieurs listes avec accès par astérisque, par exemple : $.Names[*].FullNames[*]
. En revanche, le chemin JSON de ROWEXP peut l’avoir.
2. La structure JSON définie dans le littéral COLEXPR doit être une structure de JSON
Si ce n’est pas le cas, l’utilisateur est averti que le site JSON est mal formé.
EWIs connexes¶
Pas d’EWIs connexes.
NEW JSON¶
Description¶
Alloue une nouvelle instance d’un type de données JSON. Pour plus d’informations, consultez NEW JSON Constructor Expression.
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 } ]
Le deuxième paramètre de la fonction NEW JSON est toujours omis par SnowConvert puisque Snowflake ne fonctionne qu’avec UTF-8.
Modèles d’échantillons de sources¶
NEW JSON avec des données de type chaîne¶
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"} |
Problèmes connus¶
1. Le deuxième paramètre n’est pas pris en charge
Le deuxième paramètre de la fonction utilisé pour spécifier le format du résultat JSON n’est pas pris en charge car Snowflake ne supporte que UTF-8, ce qui peut entraîner des différences de fonctionnalité pour certaines utilisations de la fonction.
2. JSON avec les données BINARY n’est pas pris en charge
Snowflake ne prend pas en charge l’analyse des données binaires pour créer une valeur JSON, l’utilisateur sera averti lorsque SnowConvert trouvera un NEW JSON avec des données binaires.
EWIs connexes¶
SSC-EWI-TD0039 : Le format d’entrée n’est pas pris en charge.
NVP¶
Description¶
Extrait la valeur de la paire clé-valeur où la clé correspond à la énième occurrence du nom spécifié à rechercher. Voir NVP.
[TD_SYSFNLIB.] NVP (
in_string,
name_to_search
[, name_delimiters ]
[, value_delimiters ]
[, occurrence ]
)
Modèles d’échantillons de sources¶
Cas de base 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 avec des paramètres optionnels ignorés¶
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 avec des espaces dans les délimiteurs¶
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 avec des délimiteurs non littéraux¶
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 ***/;
Problèmes connus¶
1. Les délimiteurs contenant des espaces (\ ) doivent avoir leur antislash échappé dans Snowflake
Dans Teradata, les délimiteurs comprenant des espaces sont spécifiés à l’aide de « \ » (voir NVP avec des espaces dans les délimiteurs), comme indiqué dans les exemples, dans Teradata il n’est pas nécessaire d’échapper l’antislash, cependant, c’est nécessaire dans Snowflake. L’échappement des antislashs dans le délimiteur peut être fait automatiquement par SnowConvert mais seulement si les valeurs du délimiteur sont des chaînes littérales, sinon l’utilisateur sera averti que les antislashs n’ont pas pu être échappés et que cela peut entraîner des résultats différents dans Snowflake.
EWIs connexes¶
SSC-FDM-TD0008 : Les délimiteurs non littéraux avec des espaces ont besoin de leur backslash échappé dans Snowflake.
OVERLAPS¶
Description¶
Selon la documentation de Teradata, l’opérateur OVERLAPS compare deux ou plusieurs expressions de période. Si elles se chevauchent, il renvoie la valeur true.
Pour plus d’informations sur les OVERLAPS de Teradata, cliquez ici.
period_expression
OVERLAPS
period_expression
L’opérateur PERIOD_OVERLAPS_UDF est une implémentation Snowflake de l’opérateur OVERLAPS dans Teradata.
Modèle de source d’échantillon¶
Teradata¶
SELECT
PERIOD(DATE '2009-01-01', DATE '2010-09-24')
OVERLAPS
PERIOD(DATE '2009-02-01', DATE '2009-06-24');
Exécution de scripts 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 ***/!!!;
Problèmes connus¶
1. Unsupported Period Expressions¶
Les expressions PERIOD(TIME WITH TIME ZONE) et PERIOD(TIMESTAMP WITH TIME ZONE) ne sont pas encore prises en charge.
EWIs connexes¶
SSC-EWI-TD0053 : Snowflake ne prend pas en charge le type de données de période, toutes les périodes sont gérées comme varchar à la place
P_INTERSECT¶
Description¶
Selon la documentation de Teradata, l’opérateur P_INTERSECT compare deux ou plusieurs expressions de période. En cas de chevauchement, il renvoie la partie commune des expressions de la période.
Pour plus d’informations le P_INTERSECT de Teradata, [cliquez ici] (https://docs.teradata.com/r/kmuOwjp1zEYg98JsB8fu_A/iW6iefgeyOypFOMY2qGG_A).
period_expression
P_INTERSECT
period_expression
PERIOD_INTERSECT_-UDF est une implémentation Snowflake de l’opérateur P_INTERSECT dans Teradata.
Modèle de source d’échantillon¶
Teradata¶
SELECT
PERIOD(DATE '2009-01-01', DATE '2010-09-24')
P_INTERSECT
PERIOD(DATE '2009-02-01', DATE '2009-06-24');
Exécution de scripts 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 ***/!!!;
Problèmes connus¶
1. Unsupported Period Expressions¶
Les expressions PERIOD(TIME WITH TIME ZONE) et PERIOD(TIMESTAMP WITH TIME ZONE) ne sont pas encore prises en charge.
EWIs connexes¶
SSC-EWI-TD0053 : Snowflake ne prend pas en charge le type de données de période, toutes les périodes sont gérées comme varchar à la place
PIVOT¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Description¶
La fonction de table pivot est utilisée pour transformer les lignes d’une table en colonnes. Pour plus d’informations, consultez la documentation de 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
Modèles d’échantillons de sources¶
Données de configuration¶
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);
Transformation PIVOT de base¶
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 avec transformation des alias¶
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 |
--------+-------+------+------+--------------+--------------+--------------+
Problèmes connus¶
1. La clause WITH n’est pas prise en charge
L’utilisation de la clause WITH n’est pas prise en charge actuellement.
2. Le pivot sur plusieurs colonnes pivot n’est pas pris en charge
Snowconvert transforme la fonction PIVOT en fonction PIVOT dans Snowflake, qui ne permet d’appliquer la fonction que sur une seule colonne.
3. Le pivot avec plusieurs fonctions d’agrégation n’est pas pris en charge
La fonction PIVOT de Snowflake ne permet d’appliquer qu’une seule fonction d’agrégation aux données.
4. La sous-requête dans la clause IN n’est pas prise en charge
La clause IN de la fonction PIVOT de Snowflake n’accepte pas les sous-requêtes.
5. Les alias ne sont pris en charge que si tous les éléments de la clause IN en sont pourvus et que la spécification de la table est présente
Pour que les noms de colonnes avec alias soient équivalents, SnowConvert exige que toutes les valeurs spécifiées dans la clause IN aient un alias spécifié et que la spécification de la table soit présente dans le code d’entrée, ceci est nécessaire pour que SnowConvert puisse créer avec succès la liste d’alias pour la table résultante.
EWIs connexes¶
SSC-EWI-0015 : La forme d’instruction pivot/unpivot d’entrée n’est pas prise en charge
RANK¶
Description¶
RANK trie un jeu de résultats et identifie le rang numérique de chaque ligne du résultat. Le seul argument de RANK est la ou les colonnes de tri, et la fonction renvoie un entier qui représente le rang de chaque ligne dans le résultat. (RANK dans Teradata)
Syntaxe Teradata¶
RANK ( sort_expression [ ASC | DESC ] [,...] )
Syntaxe Snowflake¶
RANK() OVER
(
[ PARTITION BY <expr1> ]
ORDER BY <expr2> [ { ASC | DESC } ]
[ <window_frame> ]
)
Modèle de source d’échantillon¶
Données de configuration¶
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);
RANK() utilisant l’ordre ASC, DESC, et DEFAULT¶
Teradata¶
Avertissement
Notez que la valeur par défaut de la commande Teradata lors de l’appel de RANK() est DESC. Cependant, la valeur par défaut dans Snowflake est ASC. Ainsi, DESC est ajouté dans la conversion de RANK() lorsqu’aucun ordre n’est spécifié.
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 |
Problèmes connus ¶
Aucun problème n’a été constaté.
EWIs connexes ¶
Pas d’EWIs connexes.
Fonctions Regex¶
Description¶
Teradata et Snowflake prennent en charge les fonctions qui appliquent des expressions régulières aux entrées de type varchar. Pour plus de détails, consultez la documentation Teradata et la documentation 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)
Modèles d’échantillons de sources¶
Données de configuration¶
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');
Exemple de transformation d’une expression Regex¶
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 |
Problèmes connus¶
1. Snowflake prend uniquement en charge les expressions régulièresPOSIX
L’utilisateur est averti lorsque SnowConvert trouve une expression régulière qui n’est pas POSIX.
2. L’option « l » de Teradata « match_arg » n’est pas prise en charge par Snowflake
L’option « l » n’a pas d’équivalent dans Snowflake et l’utilisateur sera averti si SnowConvert les trouve.
3. La correction de la taille du type de données CHAR peut entraîner des comportements différents
Certaines fonctions Regex de Teradata tenteront de faire correspondre la colonne entière du type de données CHAR dans une table, même si certains caractères de la colonne sont restés vides en raison de l’insertion d’une chaîne plus petite. Dans Snowflake, cela ne se produit pas car le type de données CHAR est de taille variable.
4. REGEXP_SPLIT_TO_TABLE non pris en charge
La fonction n’est actuellement pas prise en charge par Snowflake.
EWIs connexes¶
SSC-FDM-0007 : Élément avec des dépendances manquantes.
SSC-FDM-TD0016 : La valeur « l » du paramètre « match_arg » n’est pas prise en charge par Snowflake.
STRTOK_SPLIT_TO_TABLE¶
Description¶
Découpez une chaîne en une table en utilisant les délimiteurs fournis. Pour plus d’informations, consultez STRTOK_SPLIT_TO_TABLE.
[TD_SYSFNLIB.] STRTOK_SPLIT_TO_TABLE ( inkey, instring, delimiters )
RETURNS ( outkey, tokennum, token )
Modèles d’échantillons de sources¶
Données de configuration¶
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');
Transformation 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 |
Problèmes connus¶
Aucun problème connu.
EWIs connexes ¶
Pas d’EWIs connexes.
SUBSTRING¶
Description¶
Extrait une sous-chaîne d’une chaîne d’entrée donnée. Pour plus d’informations, consultez SUBSTRING/SUBSTR.
SUBSTRING(string_expr FROM n1 [FOR n2])
SUBSTR(string_expr, n1, [, n2])
Lorsque la valeur de départ de la sous-chaîne (n1) est inférieure à un, SUBSTR_UDF est insérée à la place.
Modèles d’échantillons de sources¶
Transformation 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 connexes¶
Pas d’EWIs connexes.
TD_UNPIVOT¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Description¶
TD_UNPIVOT
dans Teradata peut dé-pivoter plusieurs colonnes à la fois, tandis que Snowflake UNPIVOT
ne peut dé-pivoter qu’une seule colonne. La fonctionnalité unpivot est utilisée pour transformer les colonnes de la table spécifiée en lignes. Pour plus d’informations, voir 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' } )
]
)
La transformation suivante permet de générer une requête SQL dans Snowflake qui décompose plusieurs colonnes en même temps, de la même manière que cela fonctionne dans Teradata.
Modèles d’échantillons de sources¶
Titre des données de configuration¶
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);
Transformation 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 |
Problèmes connus¶
TD_UNPIVOT avec la clause INCLUDE_NULLS définie sur YES n’est pas prise en charge
La fonction UNPIVOT de Snowflake utilisée dans la transformation ignorera toujours les valeurs nulles, et l’utilisateur sera averti que la clause INCLUDE_NULLS n’est pas prise en charge lorsqu’elle est définie sur YES.
Les informations de la table sont nécessaires pour transformer correctement la fonction
SnowConvert a besoin du nom des colonnes utilisées dans la fonction TDUNPIVOT ; si l’utilisateur n’inclut pas la liste des colonnes dans l’expression de la requête de la fonction mais fournit le nom de la table en cours de dépivotage, la fonction tentera de récupérer les noms des colonnes dans la définition de la table. Si les noms ne peuvent pas être trouvés, l’utilisateur sera averti que la requête résultante risque de perdre des colonnes dans le résultat.
EWIs connexes¶
SSC-EWI-TD0061 : La transformation TD_UNPIVOT nécessite des informations de colonne qui n’ont pas pu être trouvées, colonnes manquantes dans le résultat.
TO_CHAR¶
Description¶
La fonction TO_CHAR convertit une valeur DateTime ou numérique en chaîne. Pour plus d’informations, consultez TO_CHAR(Numeric) et 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 et Teradata ont tous deux leur propre version de la fonction TO_CHAR. Cependant, Teradata prend en charge de nombreux formats qui ne sont pas pris en charge de manière native par Snowflake. Pour prendre en charge ces éléments de format, SnowConvert utilise les fonctions intégrées de Snowflake et les UDFs personnalisées pour générer une expression de concaténation qui produit la même chaîne que la fonction TO_CHAR originale dans Teradata.
Modèles d’échantillons de sources¶
Transformation 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 |
Transformation 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 |
Problèmes connus¶
1. Formats avec des comportements différents ou non pris en charge
Teradata propose une liste étendue d’éléments de format qui peuvent présenter un comportement différent dans Snowflake après la transformation de la fonction TO_CHAR. Pour la liste des éléments ayant des comportements différents ou non pris en charge, consultez SSC-EWI-TD0029.
EWIs connexes¶
SSC-FDM-TD0029 : Les formats pris en charge par Snowflake pour TO_CHAR diffèrent de ceux de Teradata et peuvent échouer ou avoir un comportement différent.
XMLAGG¶
Description¶
Construisez une valeur XML en effectuant une agrégation de plusieurs lignes. Pour plus d’informations, voir XMLAGG.
XMLAGG (
XML_value_expr
[ ORDER BY order_by_spec [,...] ]
[ RETURNING { CONTENT | SEQUENCE } ]
)
order_by_spec := sort_key [ ASC | DESC ] [ NULLS { FIRST | LAST } ]
Modèles d’échantillons de sources¶
Données de configuration¶
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);
Transformation 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 |
Problèmes connus¶
1. La clause RETURNING n’est actuellement pas prise en charge.
L’utilisateur sera averti que la traduction de la clause de retour sera ajoutée à l’avenir.
EWIs connexes ¶
Pas d’EWIs connexes.