SnowConvert AI - Teradata - Fonctions intégrées¶
Cette page fournit une description de la traduction des fonctions intégrées de Teradata en Snowflake
Note
Cette page ne répertorie que les fonctions qui sont déjà transformées par SnowConvert AI, si une fonction de la documentation de Teradata n’y est pas répertoriée, elle doit être considérée comme non prise en charge.
Pour plus d’informations sur les fonctions intégrées et leurs équivalents Snowflake, consultez également les fonctions intégrées courantes.
Note
Certaines fonctions Teradata n’ont pas d’équivalent direct dans Snowflake, elles sont donc transformées en un UDF fonctionnellement équivalent ; celles-ci peuvent être facilement localisées par le postfixe _UDF dans le nom de la fonction. Pour plus d’informations sur lesUDFs, SnowConvert AI utilise 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 |
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 |
Pour plus de détails sur cette transformation, consultez SSC-EWI-TD0068. |
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 |
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 |
Vérifiez 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’extensibilité qui ne sont pas proposées en tant que fonctions intégrées au système par Teradata mais qui sont transformées par SnowConvert AI
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_VARCHARavec 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_VARCHARest 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é.
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¶
Requête
SELECT COALESCE(125, 'hello', cast(850 as format '-999'));
Résultat
COLUMN1|
-------+
125 |
Snowflake¶
Requête
SELECT
COALESCE(TO_VARCHAR(125), 'hello', TO_VARCHAR(850, '9000'));
Résultat
COLUMN1|
-------+
125 |
Horodatage mélangé à des paramètres de date¶
Teradata¶
Requête
SELECT COALESCE(cast(TIMESTAMP '2021-09-14 10:14:59' as format 'HH:MI:SSBDD-MM-YYYY'), current_date);
Résultat
COLUMN1 |
-----------+
2021-09-14 |
Snowflake¶
Requête
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());
Résultat
COLUMN1 |
-----------+
2021-09-14 |
Problèmes connus¶
Aucun problème connu_._
EWIs connexes¶
SSC-EWI-TD0025: Format de sortie non 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 besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à 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¶
Requête
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');
Résultat
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22 |22 |22 |22 |
Snowflake¶
Requête
SELECT
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22');
Résultat
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22 |22 |22 |22 |
Calendrier ISO¶
Teradata¶
Requête
SELECT DAYNUMBER_OF_MONTH (DATE'2022-12-22', 'ISO');
Résultat
COLUMN1|
-------+
25 |
Snowflake¶
Requête
SELECT
PUBLIC.DAYNUMBER_OF_MONTH_UDF(DATE'2022-12-22');
Résultat
COLUMN1|
-------+
25 |
Problèmes connus ¶
Aucun problème n’a été constaté.
EWIs connexes ¶
Pas d’EWIs connexes.
FROM_BYTES¶
Spécification de traduction pour transformer la fonction TO_CHAR en une concaténation de fonctions équivalente dans Snowflake
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¶
Requête¶
SELECT
FROM_BYTES('5A1B'XB, 'base10'), --returns '23067'
FROM_BYTES('5A3F'XB, 'ASCII'), --returns 'Z\ESC '
FROM_BYTES('5A1B'XB, 'base16'); -- returns '5A1B'
Résultat¶
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+---------+
23067 | Z\ESC | 5A1B |
Snowflake¶
Requête¶
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'
Résultat¶
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¶
Spécification de traduction pour la transformation de GetQueryBandValue en Snowflake
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¶
Requête¶
SET QUERY_BAND = 'hola=hello;adios=bye;' FOR SESSION;
Snowflake¶
Requête¶
ALTER SESSION SET QUERY_TAG = 'hola=hello;adios=bye;';
GetQueryBandValue avec le paramètre QueryBandIn¶
Teradata¶
Requête¶
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;
Résultat¶
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200 | Mark200 | SaraDB | Peter3 | DbAdmin | |
+----------+----------+----------+----------+----------+----------+
Snowflake¶
Requête¶
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;
Résultat¶
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200 | Mark200 | SaraDB | Peter3 | DbAdmin | |
+----------+----------+----------+----------+----------+----------+
GetQueryBandValue sans le paramètre QueryBandIn¶
Teradata¶
Requête¶
SELECT
GETQUERYBANDVALUE(2, 'hola') as Example1,
GETQUERYBANDVALUE(2, 'adios') as Example2;
Résultat¶
+----------+----------+
| EXAMPLE1 | EXAMPLE2 |
+----------+----------+
| hello | bye |
+----------+----------+
Snowflake¶
Requête¶
SELECT
GETQUERYBANDVALUE_UDF('hola') as Example1,
GETQUERYBANDVALUE_UDF('adios') as Example2;
Résultat¶
+----------+----------+
| 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¶
Requête
SELECT JSON_CHECK('{"key": "value"}');
Exécution de scripts Snowflake¶
Requête
SELECT
IFNULL(CHECK_JSON('{"key": "value"}'), 'OK');
JSON\CHECK à l’intérieur de la transformation CASE¶
Teradata¶
Requête
SELECT CASE WHEN JSON_CHECK('{}') = 'OK' then 'OKK' ELSE 'NOT OK' END;
Exécution de scripts Snowflake¶
Requête
SELECT
CASE
WHEN UPPER(RTRIM(IFNULL(CHECK_JSON('{}'), 'OK'))) = UPPER(RTRIM('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¶
Référence de traduction pour convertir les fonctions de Teradata JSONExtractValue, JSONExtractLargeValue et JSONExtract vers l’exécution de scripts Snowflake.
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¶
Requête¶
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¶
Requête¶
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¶
Spécification de traduction pour la transformation de JSON_TABLE en une requête équivalente dans Snowflake
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, car les colonnes générées remplacent la deuxième colonne. Pour cette raison, SnowConvert AI 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¶
Requête¶
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¶
Requête¶
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¶
Requête¶
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);
Résultat¶
ID | Song name | Genre |
---+------------+-------+
1 | Late night | Jazz |
---+------------+-------+
1 | Wake up | Rock |
---+------------+-------+
1 | Who am I | Rock |
---+------------+-------+
1 | Raining | Blues |
Snowflake¶
Requête¶
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;
Résultat¶
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 ignoré par SnowConvert AI 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¶
Requête
SELECT NEW JSON ('{"name" : "cameron", "age" : 24}'),
NEW JSON ('{"name" : "cameron", "age" : 24}', LATIN);
Résultat
COLUMN1 |
COLUMN2 |
|---|---|
{« age »:24, »name »: »cameron »} |
{« age »:24, »name »: »cameron »} |
Snowflake¶
Requête
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}'));
Résultat
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 AI trouvera un NEW JSON avec des données binaires.
EWIs connexes¶
SSC-EWI-TD0039 : Format d’entrée non 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¶
Requête
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);
Résultat
COLUMN1 | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world! | Susana |
Snowflake¶
Requête
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);
Résultat
COLUMN1 | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world! | Susana |
NVP avec des paramètres optionnels ignorés¶
Teradata¶
Requête
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', '#', '=');
Résultat
COLUMN1 | COLUMN2 | COLUMN3 |
--------+---------+-------------+
Green | Blue | Los Angeles |
Snowflake¶
Requête
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);
Résultat
COLUMN1 | COLUMN2 | COLUMN3 |
--------+---------+-------------+
Green | Blue | Los Angeles |
NVP avec des espaces dans les délimiteurs¶
Teradata¶
Requête
SELECT
NVP('store = whole foods&&store: ?Bristol farms','store', '&&', '\ =\ :\ ?', 2),
NVP('Hello = bye|name = Lucas|Hello = world!', 'Hello', '|', '\ =\ ', 2);
Résultat
COLUMN1 | COLUMN2 |
--------------+---------+
Bristol farms | world! |
Snowflake¶
Requête
SELECT
PUBLIC.NVP_UDF('store = whole foods&&store: ?Bristol farms', 'store', '&&', '\\ =\\ :\\ ?', 2),
PUBLIC.NVP_UDF('Hello = bye|name = Lucas|Hello = world!', 'Hello', '|', '\\ =\\ ', 2);
Résultat
COLUMN1 | COLUMN2 |
--------------+---------+
Bristol farms | world! |
NVP avec des délimiteurs non littéraux¶
Teradata¶
Requête
SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
Snowflake¶
Requête
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 les spécifient en utilisant « \ » (voir NVP avec des espaces dans les délimiteurs), comme indiqué dans les exemples. Dans Teradata, il n’est pas nécessaire d’effectuer un échappement de la barre oblique inverse, alors que cela est nécessaire dans Snowflake. L’échappement des barres obliques inverses dans le délimiteur peut être effectué automatiquement par SnowConvert AI mais uniquement si les valeurs des délimiteurs sont des chaînes littérales, sinon l’utilisateur sera averti qu’aucun échappement ne peut être effectué sur les barres obliques inverses et que cela peut entraîner des résultats différents dans Snowflake.
EWIs connexes¶
SSC-FDM-TD0008 : Les délimiteurs non littéraux comportant des espaces ont besoin qu’un échappement de leur barre oblique inverse soit effectué 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¶
Requête
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¶
Requête
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 Period. Toutes les périodes sont traitées en tant que 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¶
Requête
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¶
Requête
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 Period. Toutes les périodes sont traitées en tant que varchar à la place.
PIVOT¶
Spécification de traduction pour le formulaire de la fonction PIVOT Teradata en Snowflake
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¶
Requête¶
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¶
Requête¶
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¶
Requête¶
SELECT *
FROM star1 PIVOT (
SUM(sales) FOR qtr
IN ('Q1',
'Q2',
'Q3')
)Tmp;
Résultat¶
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¶
Requête¶
SELECT
*
FROM
star1 PIVOT(
SUM(sales) FOR qtr IN ('Q1',
'Q2',
'Q3'))Tmp;
Résultat¶
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¶
Requête¶
SELECT *
FROM star1 PIVOT (
SUM(sales) as ss1 FOR qtr
IN ('Q1' AS Quarter1,
'Q2' AS Quarter2,
'Q3' AS Quarter3)
)Tmp;
Résultat¶
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¶
Requête¶
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;
Résultat¶
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 AI transforme la fonction PIVOT en fonction PIVOT dans Snowflake, qui ne prend en charge l’application de 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 des alias soient équivalents, SnowConvert AI 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. Cela est nécessaire pour que SnowConvert AI puisse créer correctement la liste d’alias pour la table résultante.
EWIs connexes¶
SSC-EWI-0015 : Le format de l’instruction pivot/non pivot d’entrée n’est pas pris en charge
RANK¶
Spécification de traduction pour la transformation de la fonction 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¶
Requête¶
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¶
Requête¶
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é.
Requête¶
SELECT
Sales,
RANK(Sales ASC) AS SalesAsc,
RANK(Sales DESC) AS SalesDesc,
RANK(Sales) AS SalesDefault
FROM
Sales;
Résultat¶
| 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¶
Requête¶
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;
Résultat¶
| 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¶
Requête
CREATE TABLE regexpTable
(
col1 CHAR(35)
);
INSERT INTO regexpTable VALUES('hola');
Snowflake¶
Requête
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¶
Requête
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;
Résultat
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala |null |1 |0 |
Snowflake¶
Requête
--** 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;
Résultat
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala |null |1 |FALSE |
Problèmes connus¶
1. Snowflake prend uniquement en charge les expressions régulièresPOSIX
L’utilisateur sera averti lorsque SnowConvert AI trouvera une expression régulière non-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 AI 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 dépendances manquantes.
SSC-FDM-TD0016 : La valeur “l” pour le 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¶
Requête
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¶
Requête
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¶
Requête
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;
Résultat
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¶
Requête
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;
Résultat
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¶
Requête
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);
Résultat
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W |Hel |ello W |Hel |
Snowflake¶
Requête
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);
Résultat
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W |Hel |ello W |Hel |
EWIs connexes¶
Pas d’EWIs connexes.
TD_UNPIVOT¶
Spécification de traduction pour la transformation de TD_UNPIVOT en une requête équivalente dans Snowflake
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Description¶
TD_UNPIVOT dans Teradata peut permettre de générer des lignes pour plusieurs colonnes à la fois, tandis queUNPIVOT de Snowflake peut uniquement générer des lignes pour 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¶
Requête¶
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¶
Requête¶
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¶
Requête¶
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;
Résultat¶
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¶
Requête¶
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;
Résultat¶
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 AI a besoin du nom des colonnes qui sont utilisées dans la fonction TD_UNPIVOT ; si l’utilisateur n’inclut pas la liste des colonnes dans query_expression de la fonction, mais fournit le nom de la table dont les colonnes ont été transformées en lignes, il tentera de récupérer les noms des colonnes à partir de la définition de la table. Si les noms sont introuvables, 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 introuvables sur les colonnes : 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 AI utilise des fonctions intégrées et desUDFs personnalisés de Snowflake pour générer une expression de concaténation qui produit la même chaîne que la fonction TO_CHAR dans Teradata.
Modèles d’échantillons de sources¶
Transformation TO_CHAR(DateTime)¶
Teradata¶
Requête
SELECT
TO_CHAR(date '2012-12-23'),
TO_CHAR(date '2012-12-23', 'DS'),
TO_CHAR(date '2012-12-23', 'DAY DD, MON YY');
Résultat
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
Snowflake¶
Requête
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 ***/;
Résultat
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
Transformation TO_CHAR(Numeric)¶
Teradata¶
Requête
SELECT
TO_CHAR(1255.495),
TO_CHAR(1255.495, '9.9EEEE'),
TO_CHAR(1255.495, 'SC9999.9999', 'nls_iso_currency = ''EUR''');
Résultat
COLUMN1 | COLUMN2 | COLUMN3 |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |
Snowflake¶
Requête
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 ***/;
Résultat
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 offre une liste complète d’éléments de format qui peuvent afficher un comportement différent dans Snowflake après la transformation de la fonction TO_CHAR. Pour la liste des éléments avec 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 par rapport à 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¶
Requête
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¶
Requête
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¶
Requête
select
xmlagg(o_orderkey order by o_totalprice desc) (varchar(10000))
from orders
where o_totalprice > 5;
Résultat
COLUMN1 |
--------+
4 3 1 2 |
Snowflake¶
Requête
SELECT
LEFT(TO_VARCHAR(LISTAGG ( o_orderkey, ' ')
WITHIN GROUP(
order by o_totalprice DESC NULLS LAST)), 10000)
from
orders
where o_totalprice > 5;
Résultat
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.
CAST¶
Conversion des types de données Number en type de données Varchar¶
Teradata lors de la conversion en varchar utilise des formats par défaut pour chaque type de données de nombre. Ainsi, SnowConvert AI ajoute des formats pour maintenir l’équivalence entre les plateformes.
Modèles d’échantillons de sources¶
BYTEINT¶
Teradata¶
Requête
SELECT '"'||cast(cast(12 as BYTEINT) as varchar(10))||'"';
Résultat
(('"'||12)||'"')|
----------------+
"12" |
Snowflake¶
Requête
SELECT
'"'|| LEFT(TO_VARCHAR(cast(12 as BYTEINT), 'TM'), 10) ||'"';
Résultat
"'""'|| LEFT(TO_VARCHAR(CAST(12 AS BYTEINT), 'TM'), 10) ||'""'"
---------------------------------------------------------------
"12"
SMALLINT¶
Teradata¶
Requête
SELECT '"'||cast(cast(123 as SMALLINT) as varchar(10))||'"';
Résultat
(('"'||123)||'"')|
-----------------+
"123" |
Snowflake¶
Requête
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'"';
Résultat
"'""'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"123"
INTEGER¶
Teradata¶
Requête
SELECT '"'||cast(cast(12345 as INTEGER) as varchar(10))||'"';
Résultat
(('"'||12345)||'"')|
-------------------+
"12345" |
Snowflake¶
Requête
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'"';
Résultat
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'""'"
------------------------------------------------------------------
"12345"
BIGINT¶
Teradata¶
Requête
SELECT '"'||cast(cast(12345 as BIGINT) as varchar(10))||'"';
Résultat
(('"'||12345)||'"')|
-------------------+
"12345" |
Snowflake¶
Requête
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'"';
Résultat
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"12345"
DECIMAL[(n[,m])] ou NUMERIC[(n[,m])]¶
Teradata¶
Requête
SELECT '"'||cast(cast(12345 as DECIMAL) as varchar(10))||'"',
'"'||cast(cast(12345 as DECIMAL(12, 2)) as varchar(10))||'"';
Résultat
(('"'||12345)||'"')|(('"'||12345)||'"')|
-------------------+-------------------+
"12345." |"12345.00" |
Snowflake¶
Requête
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL), 'TM.'), 10) ||'"',
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL(12, 2)), 'TM'), 10) ||'"';
Résultat
'"'|| 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¶
Requête
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;
Résultat
COLUMN1 |COLUMN2
-----------------+--------------+
"-.10" |".10" |
Snowflake¶
Requête
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;
Résultat
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
Converti en date
SELECT * FROM RESOURCE_DETAILS where change_ts >= {d '2022-09-10'};
Snowflake
Converti en date
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 Intervalle, mais il a des constantes INTERVAL qui peuvent être utilisées dans les opérations DateTime et d’autres utilisations peuvent être émulées à l’aide de VARCHAR. SnowConvert AI transformera les fonctions CAST de 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 non intervalles¶
Teradata¶
Requête
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;
Résultat
VARCHAR_TO_INTERVAL | NUMBER_TO_INTERVAL | OUTSIDE_DATETIME_OPERATION |
--------------------+--------------------+----------------------------+
2022-10-15 23:04:56 |2017-10-15 10:30:00 | 7:00 |
Snowflake¶
Requête
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;
Résultat
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 |
#x20;Valeurs non littérales et non intervalles¶
Teradata¶
Requête
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;
Résultat
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-11-04 20:30:00 | 20 10 |
Snowflake¶
Requête
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;
Résultat
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-11-04 20:30:00.000 | 20 10 |
Conversion d’un intervalle en un autre intervalle¶
Teradata¶
Requête
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;
Résultat
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-10-19 13:30:00 | 4 03 |
Snowflake¶
Requête
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;
Résultat
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.