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

Voir Fonctions des attributs

Fonctions de manipulation des bits/octets

Teradata

Snowflake

Remarque

BITAND

BITAND

BITNOT

BITNOT

BITOR

BITOR

BITXOR

BITXOR

GETBIT

GETBIT

Voir Fonctions bits/octets

Intégré (fonctions du système)

Teradata

Snowflake

Remarque

ACCOUNT

CURRENT_ACCOUNT

CURRENT_DATE

CURDATE

CURRENT_DATE

CURRENT_ROLE

CURRENT_ROLE

CURRENT_TIME
CURTIME

CURRENT_TIME

CURRENT_TIMESTAMP

CURRENT_TIMESTAMP

DATABASE

CURRENT_DATABASE

DATE

CURRENT_DATE

NOW

CURRENT_TIMESTAMP

PROFILE

CURRENT_ROLE

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”)
DAYNUMBER_OF_WEEK(DatetimeValue)

TD_DAY_OF_WEEK_UDF

DAYNUMBER_OF_YEAR(DatetimeValue, “ISO”)

PUBLIC.DAY_OF_YEAR_ISO_UDF

DAYNUMBER_OF_YEAR(DatetimeValue)

DAYOFYEAR

QUARTERNUMBER_OF_YEAR

QUARTER

TD_SUNDAY(DateTimeValue)

PREVIOUS_DAY(DateTimeValue, “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

DAYOFMONTH

TD_DAY_OF_WEEK
DAYOFWEEK

TD_DAY_OF_WEEK_UDF

TD_DAY_OF_YEAR

DAYOFYEAR

TD_MONTH_OF_CALENDAR(DateTimeValue)
MONTH_CALENDAR(DateTimeValue)

TD_MONTH_OF_CALENDAR_UDF(DateTimeValue)

TD_WEEK_OF_CALENDAR(DateTimeValue)
WEEK_OF_CALENDAR(DateTimeValue)

TD_WEEK_OF_CALENDAR_UDF(DateTimeValue)

TD_WEEK_OF_YEAR

WEEK_OF_YEAR_UDF

TD_YEAR_BEGIN(DateTimeValue)

YEAR_BEGIN_UDF(DateTimeValue)

TD_YEAR_BEGIN(DateTimeValue, “ISO”)

YEAR_BEGIN_ISO_UDF(DateTimeValue)

TD_YEAR_END(DateTimeValue)

YEAR_END_UDF(DateTimeValue)

TD_YEAR_END(DateTimeValue, “ISO”)

YEAR_END_ISO_UDF(DateTimeValue)

WEEKNUMBER_OF_MONTH(DateTimeValue)

WEEKNUMBER_OF_MONTH_UDF(DateTimeValue)

WEEKNUMBER_OF_QUARTER(DateTimeValue)

WEEKNUMBER_OF_QUARTER_UDF(DateTimeValue)

WEEKNUMBER_OF_QUARTER(DateTimeValue, “ISO”)

WEEKNUMBER_OF_QUARTER_ISO_UDF(DateTimeValue)

WEEKNUMBER_OF_QUARTER(DateTimeValue, “COMPATIBLE”)

WEEKNUMBER_OF_QUARTER_COMPATIBLE_UDF(DateTimeValue)

WEEKNUMBER_OF_YEAR(DateTimeValue)

WEEK_OF_YEAR_UDF(DateTimeValue)

WEEKNUMBER_OF_YEAR(DateTimeValue, “COMPATIBLE”)

WEEK_OF_YEAR_COMPATIBLE_UDF(DateTimeValue)

Voir Fonctions du calendrier

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

Voir Fonctions de comparaison

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

Vérifiez Conversion vers le type de données INTERVAL

TRYCAST

TRY_CAST

FROM_BYTES

TO_NUMBER
TO_BINARY

FROM\BYTES avec le paramètre ASCII n’est pas pris en charge par Snowflake.

Voir Conversions des types de données

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

Voir Fonctions de conversion des types de données

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

Voir DateTime et Fonctions et expressions d’intervalle

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
JSONExtractLargeValue

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(datetimeValue, UNTIL_CLOSED)

PERIOD_UDF(datetimeValue, “9999-12-31 23:59:59.999999”)

Voir les notes sur constantes de borne de fin

RDIFF

PERIOD_RDIFF_UDF

Voir Fonctions et opérateurs de période

Fonctions de bande de requête

Teradata

Snowflake

Remarque

GETQUERYBANDVALUE

GETQUERYBANDVALUE_UDF

Consultez GETQUERYBANDVALUE

Voir Fonctions de bande de requête

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

Voir Opérateurs et fonctions de chaîne​​​

Fonctions St_Point

Teradata

Snowflake

Remarque

ST_SPHERICALDISTANCE

HAVERSINE
ST_DISTANCE

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

Renvoie 4, tandis que l’équivalent CHARINDEX dans Snowflake :

 SELECT CHARINDEX('5', 35);
Copy

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 SnowflakeTO_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 fonctionTO_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'));
Copy

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))||'"';
Copy
(('"'||12)||'"')|
----------------+
"12"            |

Copy
Snowflake
 SELECT
'"'|| LEFT(TO_VARCHAR(cast(12 as BYTEINT), 'TM'), 10) ||'"';
Copy
"'""'|| LEFT(TO_VARCHAR(CAST(12 AS BYTEINT), 'TM'), 10) ||'""'"
---------------------------------------------------------------
"12"            

Copy

SMALLINT

Teradata
 SELECT '"'||cast(cast(123 as SMALLINT) as varchar(10))||'"';
Copy
(('"'||123)||'"')|
-----------------+
"123"            |

Copy
Snowflake
 SELECT
'"'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'"';
Copy
"'""'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"123"
Copy

INTEGER

Teradata
 SELECT '"'||cast(cast(12345 as INTEGER) as varchar(10))||'"';
Copy
(('"'||12345)||'"')|
-------------------+
"12345"            |

Copy
Snowflake
 SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'"';
Copy
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'""'"
------------------------------------------------------------------
"12345"

Copy

BIGINT

Teradata
 SELECT '"'||cast(cast(12345 as BIGINT) as varchar(10))||'"';
Copy
(('"'||12345)||'"')|
-------------------+
"12345"            |

Copy
Snowflake
 SELECT
       '"'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'"';
Copy
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"12345"

Copy

DECIMAL[(n[,m])] ou NUMERIC[(n[,m])]

Teradata
 SELECT '"'||cast(cast(12345 as DECIMAL) as varchar(10))||'"',
       '"'||cast(cast(12345 as DECIMAL(12, 2)) as varchar(10))||'"';
Copy
(('"'||12345)||'"')|(('"'||12345)||'"')|
-------------------+-------------------+
"12345."           |"12345.00"         |

Copy
Snowflake
 SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL), 'TM.'), 10) ||'"',
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL(12, 2)), 'TM'), 10) ||'"';
Copy
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL), 'TM.'), 10) ||'"'	'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL(12, 2)), 'TM'), 10) ||'"'
"12345."	"12345.00"    
Copy

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;
Copy
COLUMN1          |COLUMN2
-----------------+--------------+
"-.10"           |".10"         |

Copy
Snowflake
 SELECT
'"'|| LEFT(TO_VARCHAR(CAST(-0.1 AS DECIMAL(12, 2)), 'TM'), 10) ||'"' AS column1,
'"'|| LEFT(TO_VARCHAR(CAST(0.1 AS DECIMAL(12, 2)), 'TM'), 10) ||'"' AS column2;
Copy
COLUMN1           |COLUMN2
------------------+---------------+
"-0.10"           |"0.10"         |

Copy

EWIs 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'}
Copy

Modèles d’échantillons de sources

Conversion vers DATE avec des accolades

Teradata

 SELECT * FROM RESOURCE_DETAILS where change_ts >= {d '2022-09-10'};
Copy

Snowflake

 SELECT
* FROM
PUBLIC.RESOURCE_DETAILS
where change_ts >= DATE('2022-09-10');
Copy

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;
Copy
VARCHAR_TO_INTERVAL | NUMBER_TO_INTERVAL | OUTSIDE_DATETIME_OPERATION |
--------------------+--------------------+----------------------------+
2022-10-15 23:04:56 |2017-10-15 10:30:00 | 7:00                       |

Copy
Snowflake
 SELECT
TIMESTAMP '2022-10-15 10:30:00' + INTERVAL '12 HOUR, 34 MINUTE, 56 SECOND, 780000 MICROSECOND' AS VARCHAR_TO_INTERVAL,
TIMESTAMP '2022-10-15 10:30:00' + INTERVAL '-5 YEAR' AS NUMBER_TO_INTERVAL,
'07:00' AS OUTSIDE_DATETIME_OPERATION;
Copy
VARCHAR_TO_INTERVAL     | NUMBER_TO_INTERVAL     | OUTSIDE_DATETIME_OPERATION |
------------------------+------------------------+----------------------------+
2022-10-15 23:04:56.780 |2017-10-15 10:30:00.000 | 07:00                      |

Copy

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;
Copy
DATETIME_OPERATION  | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-11-04 20:30:00 | 20 10                      |

Copy
Snowflake
 SELECT
PUBLIC.DATETIMEINTERVALADD_UDF(TIMESTAMP '2022-10-15 10:30:00', CAST('20 ' || '10' AS VARCHAR(21)), 'DAY', '+') AS DATETIME_OPERATION,
CAST('20 ' || '10' AS VARCHAR(21)) AS OUTSIDE_DATETIME_OPERATION;
Copy
DATETIME_OPERATION      | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-11-04 20:30:00.000 | 20 10                      |

Copy

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;
Copy
DATETIME_OPERATION  | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-10-19 13:30:00 | 4 03                       |

Copy
Snowflake
 SELECT
PUBLIC.DATETIMEINTERVALADD_UDF(
TIMESTAMP '2022-10-15 10:30:00', PUBLIC.INTERVALTOINTERVAL_UDF('5999', 'MINUTE', 'MINUTE', 'DAY', 'HOUR'), 'DAY', '+') AS DATETIME_OPERATION,
PUBLIC.INTERVALTOINTERVAL_UDF('5999', 'MINUTE', 'MINUTE', 'DAY', 'HOUR') AS OUTSIDE_DATETIME_OPERATION;
Copy
DATETIME_OPERATION      | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-10-19 13:30:00.000 | 4 03                       |

Copy

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

Copy

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'));
Copy
COLUMN1|
-------+
125    |

Copy
Snowflake
 SELECT
 COALESCE(TO_VARCHAR(125), 'hello', TO_VARCHAR(850, '9000'));
Copy
COLUMN1|
-------+
125    |

Copy

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);
Copy
COLUMN1    |
-----------+
2021-09-14 |

Copy
Snowflake
 SELECT
 COALESCE(TO_DATE(TIMESTAMP '2021-09-14 10:14:59' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'HH:MI:SSBDD-MM-YYYY' NOT SUPPORTED. ***/!!!), CURRENT_DATE());
Copy
COLUMN1    |
-----------+
2021-09-14 |

Copy

Problèmes connus

Aucun problème connu_._

EWIs connexes

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;
Copy
Code de sortie :
 SELECT
current_timestamp(4);
Copy

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

Copy

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');
Copy
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22     |22     |22     |22     |

Copy
Snowflake
 SELECT
    DAYOFMONTH(DATE'2022-12-22'),
    DAYOFMONTH(DATE'2022-12-22'),
    DAYOFMONTH(DATE'2022-12-22'),
    DAYOFMONTH(DATE'2022-12-22');
Copy
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22     |22     |22     |22     |

Copy

Calendrier ISO

Teradata
 SELECT DAYNUMBER_OF_MONTH (DATE'2022-12-22', 'ISO');
Copy
COLUMN1|
-------+
25     |

Copy
Snowflake
 SELECT
PUBLIC.DAYNUMBER_OF_MONTH_UDF(DATE'2022-12-22');
Copy
COLUMN1|
-------+
25     |

Copy

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'
Copy
COLUMN1    | COLUMN2    | COLUMN3 |
-----------+------------+---------+
23067      |  Z\ESC     | 5A1B    |

Copy
Snowflake
 SELECT
--returns '23067'
TO_NUMBER('5A1B', 'XXXX'),
--returns 'Z\ESC '
!!!RESOLVE EWI!!! /*** SSC-EWI-0031 - FROM_BYTES FUNCTION NOT SUPPORTED ***/!!!
FROM_BYTES(TO_BINARY('5A3F'), 'ASCII'),
TO_BINARY('5A1B', 'HEX'); -- returns '5A1B'
Copy
COLUMN1    | COLUMN2    | COLUMN3 |
-----------+------------+---------+
23067      |  Z\ESC     | 5A1B    |

Copy

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Problèmes connus

  1. Le paramètre de format TO\NUMBER doit correspondre aux chiffres de la chaîne d’entrée.

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

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

Copy

Modèles d’échantillons de sources

Données de configuration

Teradata
 SET QUERY_BAND = 'hola=hello;adios=bye;' FOR SESSION;
Copy
Snowflake
 ALTER SESSION SET QUERY_TAG = 'hola=hello;adios=bye;';
Copy

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;
Copy
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200  | Mark200  | SaraDB   | Peter3   | DbAdmin  |          |
+----------+----------+----------+----------+----------+----------+

Copy
Snowflake
 SELECT
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'account') as Example1,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'account') as Example2,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 2, 'account') as Example3,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 3, 'account') as Example4,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'role') as Example5,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'role') as Example6;
Copy
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200  | Mark200  | SaraDB   | Peter3   | DbAdmin  |          |
+----------+----------+----------+----------+----------+----------+

Copy

GetQueryBandValue sans le paramètre QueryBandIn

Teradata
 SELECT
GETQUERYBANDVALUE(2, 'hola') as Example1,
GETQUERYBANDVALUE(2, 'adios') as Example2;
Copy
+----------+----------+
| EXAMPLE1 | EXAMPLE2 |
+----------+----------+
| hello    | bye      |
+----------+----------+

Copy
Snowflake
 SELECT
GETQUERYBANDVALUE_UDF('hola') as Example1,
GETQUERYBANDVALUE_UDF('adios') as Example2;
Copy
+----------+----------+
| EXAMPLE1 | EXAMPLE2 |
+----------+----------+
| hello    | bye      |
+----------+----------+

Copy

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

Modèle de source d’échantillon

Modèle source de base

Teradata
 SELECT JSON_CHECK('{"key": "value"}');
Copy
Exécution de scripts Snowflake
 SELECT
IFNULL(CHECK_JSON('{"key": "value"}'), 'OK');
Copy

JSON\CHECK à l’intérieur de la transformation CASE

Teradata
 SELECT CASE WHEN JSON_CHECK('{}') = 'OK' then 'OKK' ELSE 'NOT OK' END;
Copy
Exécution de scripts Snowflake
 SELECT
CASE
WHEN IFNULL(CHECK_JSON('{}'), 'OK') = 'OK'
THEN 'OKK' ELSE 'NOT OK'
END;
Copy

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

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

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

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

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

Copy

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"}
]
}'));
Copy
Snowflake
 CREATE OR REPLACE TABLE myJsonTable (
 col1 integer,
 col2 VARIANT
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

INSERT INTO myJsonTable
VALUES (1, TO_JSON(PARSE_JSON('{
"name": "Matt",
"age" : 30,
"songs" : [
	{"name" : "Late night", "genre" : "Jazz"},
	{"name" : "Wake up", "genre" : "Rock"},
	{"name" : "Who am I", "genre" : "Rock"},
	{"name" : "Raining", "genre" : "Blues"}
]
}')));
Copy

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);
Copy
ID | Song name  | Genre |
---+------------+-------+
1  | Late night | Jazz  |
---+------------+-------+
1  | Wake up    | Rock  |
---+------------+-------+
1  | Who am I   | Rock  |
---+------------+-------+
1  | Raining    | Blues |

Copy
Snowflake
 SELECT
* FROM
(
SELECT
COL1 AS ID,
rowexpr.value:name :: CHAR(20) AS "Song name",
rowexpr.value:genre :: VARCHAR(20) AS Genre
FROM
myJsonTable,
TABLE(FLATTEN(INPUT => COL2:songs)) rowexpr
WHERE col1 = 1
) JT;
Copy
ID | Song name  | Genre |
---+------------+-------+
1  | Late night | Jazz  |
---+------------+-------+
1  | Wake up    | Rock  |
---+------------+-------+
1  | Who am I   | Rock  |
---+------------+-------+
1  | Raining    | Blues |

Copy

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

Copy

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);
Copy
COLUMN1                     | COLUMN2                     |
----------------------------+-----------------------------+
{"age":24,"name":"cameron"} | {"age":24,"name":"cameron"} |

Copy
Snowflake
 SELECT
TO_JSON(PARSE_JSON('{"name" : "cameron", "age" : 24}')),
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'LATIN' NOT SUPPORTED ***/!!!
TO_JSON(PARSE_JSON('{"name" : "cameron", "age" : 24}'));
Copy
COLUMN1                     | COLUMN2                     |
----------------------------+-----------------------------+
{"age":24,"name":"cameron"} | {"age":24,"name":"cameron"} |

Copy

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

  1. 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 ]
)

Copy

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);
Copy
COLUMN1        | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world!  | Susana  |

Copy
Snowflake
 SELECT
PUBLIC.NVP_UDF('entree=-orange chicken&entree+.honey salmon', 'entree', '&', '=- +.', 1),
PUBLIC.NVP_UDF('Hello=bye|name=Lucas|Hello=world!', 'Hello', '|', '=', 2),
PUBLIC.NVP_UDF('Player=Mario$Game&Tenis%Player/Susana$Game=Chess', 'Player', '% $', '= & /', 2);
Copy
COLUMN1        | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world!  | Susana  |

Copy

NVP 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', '#', '=');
Copy
COLUMN1 | COLUMN2 | COLUMN3     |
--------+---------+-------------+
Green   | Blue    | Los Angeles |

Copy
Snowflake
 SELECT
    PUBLIC.NVP_UDF('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color', '&', '=', 1),
    PUBLIC.NVP_UDF('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color', '&', '=', 2),
    PUBLIC.NVP_UDF('City=Los Angeles#Color=Green#Color=Blue#City=San Jose', 'City', '#', '=', 1);
Copy
COLUMN1 | COLUMN2 | COLUMN3     |
--------+---------+-------------+
Green   | Blue    | Los Angeles |

Copy

NVP 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);
Copy
COLUMN1       | COLUMN2 |
--------------+---------+
Bristol farms | world!  |

Copy
Snowflake
 SELECT
PUBLIC.NVP_UDF('store = whole foods&&store: ?Bristol farms', 'store', '&&', '\\ =\\  :\\ ?', 2),
PUBLIC.NVP_UDF('Hello = bye|name = Lucas|Hello = world!', 'Hello', '|', '\\ =\\ ', 2);
Copy
 COLUMN1       | COLUMN2 |
--------------+---------+
Bristol farms | world!  |
Copy

NVP avec des délimiteurs non littéraux

Teradata
 SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
Copy
Snowflake
 SELECT
PUBLIC.NVP_UDF('store = whole foods&&store: ?Bristol farms', 'store', '&&', valueDelimiter, 2) /*** SSC-FDM-TD0008 - WHEN NVP_UDF FOURTH PARAMETER IS NON-LITERAL AND IT CONTAINS A BACKSLASH, THAT BACKSLASH NEEDS TO BE ESCAPED ***/;
Copy

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

  1. 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
Copy

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

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 ***/!!!;
Copy

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

  1. 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
Copy

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

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 ***/!!!;
Copy

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

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

Copy

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);
Copy
Snowflake
 CREATE OR REPLACE TABLE star1 (
	country VARCHAR(20),
	state VARCHAR(10),
	yr INTEGER,
	qtr VARCHAR(3),
	sales INTEGER,
	cogs INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

INSERT INTO star1
VALUES ('USA', 'CA', 2001, 'Q1', 30, 15);

INSERT INTO star1
VALUES ('Canada', 'ON', 2001, 'Q2', 10, 0);

INSERT INTO star1
VALUES ('Canada', 'BC', 2001, 'Q3', 10, 0);

INSERT INTO star1
VALUES ('USA', 'NY', 2001, 'Q1', 45, 25);

INSERT INTO star1
VALUES ('USA', 'CA', 2001, 'Q2', 50, 20);
Copy

Transformation PIVOT de base

Teradata
 SELECT *
FROM star1 PIVOT (
	SUM(sales) FOR qtr                                                                                               
    IN ('Q1',                                                                                                     
    	'Q2', 
        'Q3')
)Tmp;
Copy
Country | State | yr   | cogs | 'Q1' | 'Q2' | 'Q3' |
--------+-------+------+------+------+------+------+
Canada	| BC	| 2001 | 0    | null | null | 10   |
--------+-------+------+------+------+------+------+
USA 	| NY	| 2001 | 25   | 45   | null | null |
--------+-------+------+------+------+------+------+
Canada 	| ON 	| 2001 | 0    | null | 10   | null |
--------+-------+------+------+------+------+------+
USA 	| CA 	| 2001 | 20   | null | 50   | null |
--------+-------+------+------+------+------+------+
USA 	| CA 	| 2001 | 15   | 30   | null | null |
--------+-------+------+------+------+------+------+

Copy
Snowflake
 SELECT
	*
FROM
	star1 PIVOT(
	SUM(sales) FOR qtr IN ('Q1',
	   	'Q2',
	       'Q3'))Tmp;
Copy
Country | State | yr   | cogs | 'Q1' | 'Q2' | 'Q3' |
--------+-------+------+------+------+------+------+
Canada	| BC	| 2001 | 0    | null | null | 10   |
--------+-------+------+------+------+------+------+
USA 	| NY	| 2001 | 25   | 45   | null | null |
--------+-------+------+------+------+------+------+
Canada 	| ON 	| 2001 | 0    | null | 10   | null |
--------+-------+------+------+------+------+------+
USA 	| CA 	| 2001 | 20   | null | 50   | null |
--------+-------+------+------+------+------+------+
USA 	| CA 	| 2001 | 15   | 30   | null | null |
--------+-------+------+------+------+------+------+

Copy

PIVOT 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;
Copy
Country | State | yr   | cogs | Quarter1_ss1 | Quarter2_ss1 | Quarter3_ss1 |
--------+-------+------+------+--------------+--------------+--------------+
Canada	| BC	| 2001 | 0    | null 	     | null         | 10           |
--------+-------+------+------+--------------+--------------+--------------+
USA 	| NY	| 2001 | 25   | 45 	     | null 	    | null         |
--------+-------+------+------+--------------+--------------+--------------+
Canada 	| ON 	| 2001 | 0    | null 	     | 10 	    | null 	   |
--------+-------+------+------+--------------+--------------+--------------+
USA 	| CA 	| 2001 | 20   | null         | 50           | null         |
--------+-------+------+------+--------------+--------------+--------------+
USA 	| CA 	| 2001 | 15   | 30           | null         | null         |
--------+-------+------+------+--------------+--------------+--------------+

Copy
Snowflake
 SELECT
	*
FROM
	!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
	star1 PIVOT(
	SUM(sales) FOR qtr IN (
	                       !!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
	                       'Q1',
	!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
	   	'Q2',
	!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT RENAME COLUMN NOT SUPPORTED ***/!!!
	       'Q3'))Tmp;
Copy
 Country | State | yr   | cogs | Quarter1_ss1 | Quarter2_ss1 | Quarter3_ss1 |
--------+-------+------+------+--------------+--------------+--------------+
Canada	| BC	| 2001 | 0    | null 	     | null         | 10           |
--------+-------+------+------+--------------+--------------+--------------+
USA 	| NY	| 2001 | 25   | 45 	     | null 	    | null         |
--------+-------+------+------+--------------+--------------+--------------+
Canada 	| ON 	| 2001 | 0    | null 	     | 10 	    | null 	   |
--------+-------+------+------+--------------+--------------+--------------+
USA 	| CA 	| 2001 | 20   | null         | 50           | null         |
--------+-------+------+------+--------------+--------------+--------------+
USA 	| CA 	| 2001 | 15   | 30           | null         | null         |
--------+-------+------+------+--------------+--------------+--------------+
Copy

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

  1. 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 ] [,...] )
Copy

Syntaxe Snowflake

 RANK() OVER 
( 
    [ PARTITION BY <expr1> ]
    ORDER BY <expr2> [ { ASC | DESC } ] 
    [ <window_frame> ]
)
Copy

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);
Copy
Snowflake
 CREATE OR REPLACE TABLE Sales (
  Product VARCHAR(255),
  Sales INT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

INSERT INTO Sales (Product, Sales)
VALUES ('A', 100);

INSERT INTO Sales (Product, Sales)
VALUES ('B', 150);

INSERT INTO Sales (Product, Sales)
VALUES ('C', 200);

INSERT INTO Sales (Product, Sales)
VALUES ('D', 150);

INSERT INTO Sales (Product, Sales)
VALUES ('E', 120);

INSERT INTO Sales (Product, Sales)
VALUES ('F', NULL);
Copy

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;
Copy
SALESSALESASCSALESDESCSALESDEFAULT
NULL666
200511
150322
150322
120244
100155
Snowflake
 SELECT
  Sales,
  RANK() OVER (
  ORDER BY
    Sales ASC) AS SalesAsc,
    RANK() OVER (
    ORDER BY
    Sales DESC NULLS LAST) AS SalesDesc,
    RANK() OVER (
    ORDER BY
    Sales DESC NULLS LAST) AS SalesDefault
    FROM
    Sales;
Copy
SALESSALESASCSALESDESCSALESDEFAULT
NULL666
200511
150322
150322
120244
100155

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)

Copy

Modèles d’échantillons de sources

Données de configuration

Teradata
 CREATE TABLE regexpTable
(
    col1 CHAR(35)
);

INSERT INTO regexpTable VALUES('hola');
Copy
Snowflake
 CREATE OR REPLACE TABLE regexpTable
(
    col1 CHAR(35)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

INSERT INTO regexpTable
VALUES ('hola');
Copy

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;
Copy
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala   |null   |1      |0      |

Copy
Snowflake
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "regexpTable" **
SELECT
REGEXP_REPLACE(col1, '.*(h(i|o))', 'ha', 1, 0),
REGEXP_SUBSTR(COL1, '.*(h(i|o))', 2, 1),
REGEXP_INSTR(COL1, '.*(h(i|o))', 1, 1, 0),
--** SSC-FDM-TD0016 - VALUE 'l' FOR PARAMETER 'match_arg' IS NOT SUPPORTED IN SNOWFLAKE **
REGEXP_LIKE(COL1, '.*(h(i|o))')
FROM
regexpTable;
Copy
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala   |null   |1      |FALSE  |

Copy

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

  1. SSC-FDM-0007 : Élément avec des dépendances manquantes.

  2. 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 )

Copy

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');
Copy
Snowflake
 CREATE OR REPLACE TABLE strtokTable
(
	col1 INTEGER,
	col2 VARCHAR(100)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

INSERT INTO strtokTable
VALUES (4, 'hello-world-split-me');

INSERT INTO strtokTable
VALUES (1, 'string$split$by$dollars');
Copy

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;
Copy
outkey |tokennum | token  |
-------+---------+--------+
1      |1        |string  |
-------+---------+--------+
1      |2        |split   |
-------+---------+--------+
1      |3        |by      |
-------+---------+--------+
1      |4        |dollars |
-------+---------+--------+
4      |1        |hello   |
-------+---------+--------+
4      |2        |world   |
-------+---------+--------+
4      |3        |split   |
-------+---------+--------+
4      |4        |me      |

Copy
Snowflake
 SELECT
CAST(strtokTable.col1 AS INTEGER) AS outkey,
CAST(INDEX AS INTEGER) AS tokennum,
CAST(VALUE AS VARCHAR) AS token
FROM
strtokTable,
table(STRTOK_SPLIT_TO_TABLE(strtokTable.col2, '-$')) AS testTable
ORDER BY outkey, tokennum;
Copy
outkey |tokennum | token  |
-------+---------+--------+
1      |1        |string  |
-------+---------+--------+
1      |2        |split   |
-------+---------+--------+
1      |3        |by      |
-------+---------+--------+
1      |4        |dollars |
-------+---------+--------+
4      |1        |hello   |
-------+---------+--------+
4      |2        |world   |
-------+---------+--------+
4      |3        |split   |
-------+---------+--------+
4      |4        |me      |

Copy

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

Copy

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);
Copy
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W  |Hel     |ello W  |Hel      |

Copy
Snowflake
 SELECT
SUBSTR('Hello World!', 2, 6),
PUBLIC.SUBSTR_UDF('Hello World!', -2, 6),
SUBSTRING('Hello World!', 2, 6),
PUBLIC.SUBSTR_UDF('Hello World!', -2, 6);
Copy
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W  |Hel     |ello W  |Hel      |

Copy

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

Copy

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);
Copy
Snowflake
 CREATE OR REPLACE TABLE superunpivottest (
	myKey INTEGER NOT NULL PRIMARY KEY,
	firstSemesterIncome DECIMAL(10,2),
	secondSemesterIncome DECIMAL(10,2),
	firstSemesterExpenses DECIMAL(10,2),
	secondSemesterExpenses DECIMAL(10,2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

INSERT INTO superUnpivottest
VALUES (2020, 15440, 25430.57, 10322.15, 12355.36);

INSERT INTO superUnpivottest
VALUES (2018, 18325.25, 25220.65, 15560.45, 15680.33);

INSERT INTO superUnpivottest
VALUES (2019, 23855.75, 34220.22, 14582.55, 24122);
Copy

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;
Copy
myKey |Semester |Income   | Expenses |
------+---------+---------+----------+
2018  |First    |18325.25 |15560.45  |
------+---------+---------+----------+
2018  |Second   |25220.65 |15680.33  |
------+---------+---------+----------+
2019  |First    |23855.75 |14582.55  |
------+---------+---------+----------+
2019  |Second   |34220.22 |24122.00  |
------+---------+---------+----------+
2020  |First    |15440.00 |10322.15  |
------+---------+---------+----------+
2020  |Second   |25430.57 |12355.36  |


Copy
Snowflake
 SELECT
 * FROM
 !!!RESOLVE EWI!!! /*** SSC-EWI-TD0061 - TD_UNPIVOT TRANSFORMATION REQUIRES COLUMN INFORMATION THAT COULD NOT BE FOUND, COLUMNS MISSING IN RESULT ***/!!!
 (
  SELECT
   TRIM(GET_IGNORE_CASE(OBJECT_CONSTRUCT('FIRSTSEMESTERINCOME', 'First', 'FIRSTSEMESTEREXPENSES', 'First', 'SECONDSEMESTERINCOME', 'Second', 'SECONDSEMESTEREXPENSES', 'Second'), Semester), '"') AS Semester,
   Income,
   Expenses
  FROM
   superunpivottest UNPIVOT(Income FOR Semester IN (
    firstSemesterIncome,
    secondSemesterIncome
   )) UNPIVOT(Expenses FOR Semester1 IN (
    firstSemesterExpenses,
    secondSemesterExpenses
   ))
  WHERE
   Semester = 'FIRSTSEMESTERINCOME'
   AND Semester1 = 'FIRSTSEMESTEREXPENSES'
   OR Semester = 'SECONDSEMESTERINCOME'
   AND Semester1 = 'SECONDSEMESTEREXPENSES'
 ) X ORDER BY mykey, Semester;
Copy
myKey |Semester |Income   | Expenses |
------+---------+---------+----------+
2018  |First    |18325.25 |15560.45  |
------+---------+---------+----------+
2018  |Second   |25220.65 |15680.33  |
------+---------+---------+----------+
2019  |First    |23855.75 |14582.55  |
------+---------+---------+----------+
2019  |Second   |34220.22 |24122.00  |
------+---------+---------+----------+
2020  |First    |15440.00 |10322.15  |
------+---------+---------+----------+
2020  |Second   |25430.57 |12355.36  |

Copy

Problèmes connus

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

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

  1. 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])

Copy

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');
Copy
COLUMN1    | COLUMN2    | COLUMN3           |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |

Copy
Snowflake
 SELECT
TO_CHAR(date '2012-12-23') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
TO_CHAR(date '2012-12-23', 'MM/DD/YYYY') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
PUBLIC.DAYNAME_LONG_UDF(date '2012-12-23', 'uppercase') || TO_CHAR(date '2012-12-23', ' DD, ') || PUBLIC.MONTH_SHORT_UDF(date '2012-12-23', 'uppercase') || TO_CHAR(date '2012-12-23', ' YY') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;
Copy
COLUMN1    | COLUMN2    | COLUMN3           |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |

Copy

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''');
Copy
COLUMN1  | COLUMN2 | COLUMN3       |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |

Copy
Snowflake
 SELECT
TO_CHAR(1255.495) /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
TO_CHAR(1255.495, '9.0EEEE') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
PUBLIC.INSERT_CURRENCY_UDF(TO_CHAR(1255.495, 'S9999.0000'), 2, 'EUR') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;
Copy
COLUMN1  | COLUMN2 | COLUMN3       |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |

Copy

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

  1. 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 } ]

Copy

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);
Copy
Snowflake
 CREATE OR REPLACE TABLE orders (
	o_orderkey int,
	o_totalprice float)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

INSERT INTO orders
VALUES (1,500000);

INSERT INTO orders
VALUES (2,100000);

INSERT INTO orders
VALUES (3,600000);

INSERT INTO orders
VALUES (4,700000);
Copy

Transformation XMLAGG

Teradata
 select 
    xmlagg(o_orderkey order by o_totalprice desc) (varchar(10000))
from orders
where o_totalprice > 5;
Copy
COLUMN1 |
--------+
4 3 1 2 |

Copy
Snowflake
 SELECT
    LEFT(TO_VARCHAR(LISTAGG ( o_orderkey, ' ')
    WITHIN GROUP(
 order by o_totalprice DESC NULLS LAST)), 10000)
    from
    orders
    where o_totalprice > 5;
Copy
COLUMN1 |
--------+
4 3 1 2 |

Copy

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.