SnowConvert: Funções integradas do Teradata

Nota

Esta página lista apenas as funções que já foram transformadas pelo SnowConvert. Se uma função da documentação do Teradata não estiver listada aqui, ela deverá ser considerada sem suporte.

Nota

Algumas funções do Teradata não têm um equivalente direto no Snowflake, portanto, são transformadas em um equivalente funcional UDF, que pode ser facilmente identificado pelo pós-fixo _UDF no nome da função. Para obter mais informações sobre os usos do UDFs pelo SnowConvert, consulte este repositório git.

Funções de agregação

Teradata

Snowflake

Observação

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

Verifique 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 com várias funções<br>não é compatível com o Snowflake</p>

VAR_POP

VAR_POP

VAR_SAMP

VAR_SAMP

Consulte Funções agregadas

Operadores/Funções aritméticas, trigonométricas e hiperbólicas

Teradata

Snowflake

Observação

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

Consulte Operadores/Funções aritméticas, trigonométricas e hiperbólicas

Funções de atributo

Teradata

Snowflake

Observação

BIT_LENGTH

BIT_LENGTH

BYTE

BYTES

LENGTH

CHAR

CHARS

CHARACTERS

LEN

CHAR_LENGTH

CHARACTER_LENGTH

LEN

MCHARACTERS

LENGTH

OCTECT_LENGTH

OCTECT_LENGTH

Consulte Funções de atributo

Funções de manipulação de bit/byte

Teradata

Snowflake

Observação

BITAND

BITAND

BITNOT

BITNOT

BITOR

BITOR

BITXOR

BITXOR

GETBIT

GETBIT

Consulte Funções de bit/byte

Integradas (funções do sistema)

Teradata

Snowflake

Observação

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

Consulte Funções integradas

Calendários de negócios

Teradata

Snowflake

Observação

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

Consulte Calendários de negócios

Funções de calendário

Teradata

Snowflake

Observação

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)

Consulte Funções de calendário

Funções de caso

Teradata

Snowflake

Observação

COALESCE

COALESCE

Verifique Coalesce.

NULLIF

NULLIF

Consulte funções de caso

Funções de comparação

Teradata

Snowflake

Observação

DECODE

DECODE

GREATEST

GREATEST

LEAST

LEAST

Consulte funções de comparação

Conversões do tipo de dados

Teradata

Snowflake

Observação

CAST

CAST

CAST(DatetimeValue AS INT)

DATE_TO_INT_UDF

CAST (VarcharValue AS INTERVAL)

INTERVAL_UDF

Verifique Conversão para tipo de dados INTERVAL

TRYCAST

TRY_CAST

FROM_BYTES

TO_NUMBER
TO_BINARY

FROM_BYTES com o parâmetro ASCII não é compatível com o Snowflake.

Consulte Conversões de tipos de dados

Funções de conversão de tipos de dados

Teradata

Snowflake

Observação

TO_BYTES(Input, “Base10”)

INT2HEX_UDF(Input)

TO_NUMBER

TO_NUMBER

TO_CHAR

TO_CHAR ou expressão equivalente

Verifique TO_CHAR.

TO_DATE

TO_DATE

TO_DATE(input, “YYYYDDD”)

JULIAN_TO_DATE_UDF

Consulte Funções de conversão de tipo de dados

DateTime e funções de intervalo

Teradata

Snowflake

Observação

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

Consulte DateTime e funções e expressões de intervalo

Funções de hash

Teradata

Snowflake

Observação

HASH_MD5

MD5

HASHAMP

HASHBACKAM

HASHBUCKET

HASHROW

Sem suporte

Confira as notas sobre as diferenças de arquitetura entre o Teradata e o Snowflake

Consulte Funções de hash

Funções JSON

Teradata

Snowflake

Observação

NEW JSON

TO_JSON(PARSE_JSON() )

Verifique NEW JSON

JSON_CHECK

CHECK_JSON

Verifique JSON_CHECK

JSON_TABLE

Consulta equivalente

Verifique JSON_TABLE

JSONExtract

JSONExtractValue
JSONExtractLargeValue

JSON_EXTRACT_UDF

Verifique JSON_EXTRACT

Consulte a documentação do JSON

Funções de tratamento de nulos

Teradata

Snowflake

Observação

NVL

NVL

NVL2

NVL2

Consulte Funções de tratamento de nulos

Funções de agregação de janela/análise ordenada

Teradata

Snowflake

Observação

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

Consulte Funções da janela

Funções e operadores de período

Teradata

Snowflake

Observação

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

Consulte as observações sobre constantes de limite final

RDIFF

PERIOD_RDIFF_UDF

Consulte Funções e operadores de período

Funções de banda de consulta

Teradata

Snowflake

Observação

GETQUERYBANDVALUE

GETQUERYBANDVALUE_UDF

Verifique GETQUERYBANDVALUE

Consulte Funções de banda de consulta

Funções Regex

Teradata

Snowflake

Observação

REGEXP_INSTR

REGEXP_INSTR

Verifique Funções Regex

REGEXP_REPLACE

REGEXP_REPLACE

Verifique Funções Regex

REGEXP_SIMILAR

REGEXP_LIKE

Verifique Funções Regex

REGEXP_SUBSTR

REGEXP_SUBSTR

Verifique Funções Regex

Consulte Funções Regex

Operadores e funções de cadeia de caracteres

Teradata

Snowflake

Observação

ASCII

ASCII

CHAR2HEXINT

CHAR2HEXINT_UDF

CHR

CHR/CHAR

CHAR_LENGTH

LEN

CONCAT

CONCAT

EDITDISTANCE

EDITDISTANCE

INDEX

CHARINDEX

Verifique as notas sobre conversão implícita

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

Verifique as notas sobre conversão implícita

REVERSE

REVERSE

RIGHT

RIGHT

RPAD

RPAD

RTRIM

RTRIM

SOUNDEX

SOUNDEX_P123

STRTOK

STRTOK

STRTOK_SPLIT_TO_TABLE

STRTOK_SPLIT_TO_TABLE

Verifique Strtok_split\_to\_table

SUBSTRING

SUBSTR/SUBSTR_UDF

Verifique Substring

TRANSLATE_CHK

TRANSLATE_CHK_UDF

TRIM(LEADING “0” FROMaTABLE)

LTRIM(aTABLE, “0”)

TRIM(TRAILING “0” FROMaTABLE)

RTRIM(aTABLE, “0”)

TRIM(BOTH “0” FROMaTABLE)

TRIM(aTABLE, “0”)

TRIM(CAST(numericValue AS FORMAT “999”))

LPAD(numericValue, 3, 0)

UPPER

UPPER

Consulte Funções e operadores de cadeia de caracteres​​​

Funções St_Point

Teradata

Snowflake

Observação

ST_SPHERICALDISTANCE

HAVERSINE
ST_DISTANCE

Consulte Funções St_Point

Operadores de tabela

Teradata

Snowflake

Observação

TD_UNPIVOT

Consulta equivalente

Verifique Td_unpivot

Consulte Operadores de tabela

Funções XML

Teradata

Snowflake

Observação

XMLAGG

LISTAGG

Verifique Xmlagg

XMLQUERY

Sem suporte

Consulte Funções XML

UDFs de extensibilidade

Esta seção contém UDFs e outras funções de extensibilidade que não são oferecidas como funções integradas ao sistema pelo Teradata, mas que são transformadas pelo SnowConvert

Teradata

Snowflake

Observação

CHKNUM

CHKNUM_UDF

Consulte esta página de download de UDF

Notas

Diferenças de arquitetura entre o Teradata e o Snowflake

O Teradata tem uma arquitetura sem compartilhamento com Access Module Processors (AMP), em que cada AMP gerencia sua própria parcela de armazenamento em disco e é acessado por meio de hashing ao fazer consultas. Para aproveitar o paralelismo, as informações armazenadas devem ser distribuídas uniformemente entre AMPs e, para isso, o Teradata oferece um grupo de funções relacionadas a hash que podem ser usadas para determinar a qualidade dos índices primários reais.

Por outro lado, a arquitetura do Snowflake é diferente e gerencia a forma como os dados são armazenados por conta própria, o que significa que os usuários não precisam se preocupar em otimizar a distribuição dos dados.

Constantes de limite final (UNTIL_CHANGED e UNTIL_CLOSED)

Tanto UNTIL_CHANGED quanto UNTIL_CLOSED são constantes do Teradata que representam um limite final indefinido para períodos. Internamente, essas constantes são representadas como o valor máximo que um carimbo de data/hora pode ter, ou seja, “9999-12-31 23:59:59.999999”. Durante a migração da função PERIOD, o limite final é verificado, se presente, para determinar se é uma dessas constantes e para substituí-lo por varchar de valor “9999-12-31 23:59:59.999999”, caso seja, o Snowflake então converte o varchar em data ou carimbo de data/hora, dependendo do tipo do limite inicial ao chamar PERIOD____UDF.

Conversão implícita

Algumas funções de cadeia de caracteres do Teradata, como INDEX ou POSITION, aceitam tipos de dados diferentes e os convertem implicitamente em cadeia de caracteres, o que pode causar inconsistências nos resultados dessas funções entre o Teradata e o Snowflake. Por exemplo, o seguinte código do Teradata:

 SELECT INDEX(35, '5');
Copy

Retorna 4, enquanto o equivalente CHARINDEX no Snowflake:

 SELECT CHARINDEX('5', 35);
Copy

Retorna 2, isso acontece porque o Teradata tem seus próprios formatos padrão que são usados durante a conversão implícita. No exemplo acima, o Teradata interpreta a constante numérica 35 como BYTEINT e usa o formato padrão BYTEINT'-999' para a conversão implícita em cadeia de caracteres, fazendo com que o valor convertido seja ' 35'. Por outro lado, o Snowflake usa seus próprios formatos padrão, criando inconsistências no resultado.

Para resolver isso, as seguintes alterações são feitas nesses parâmetros de função:

  • Se o parâmetro não tiver uma conversão com formato, será adicionada uma função TO_VARCHARdo Snowflake com o equivalente ao formato padrão do Teradata no Snowflake.

  • Se o parâmetro tiver uma conversão com formato, o formato será convertido em seu equivalente no Snowflake e a funçãoTO_VARCHARserá adicionada.

    • Como observação adicional, o Teradata ignora o sinal de um número se ele não for explicitamente colocado em um formato, enquanto o Snowflake sempre adiciona espaços para inserir o sinal, mesmo quando não especificado. Nesses casos, é feita uma verificação para ver se o sinal foi especificado e para removê-lo da cadeia de caracteres do Snowflake, caso não tenha sido.

Após essas alterações, o código resultante seria o seguinte:

 SELECT CHARINDEX( '5', TO_VARCHAR(35, 'MI999'));
Copy

Que retorna 4, o mesmo que o código do Teradata.

Problemas conhecidos

Não foram encontrados problemas.

Conversão do tipo de dados Number para o tipo de dados Varchar

O Teradata, quando converte para varchar, usa formatos padrão para cada tipo de dado numérico, portanto, o Snowconvert adiciona formatos para manter a equivalência entre as plataformas.

Amostra de padrões da origem

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

Problemas conhecidos

  • O Teradata trata os números entre 0 e 1 de forma diferente do Snowflake. Para esses valores, o Teradata não adiciona o zero antes do ponto, mas o Snowflake faz isso.

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 Relacionados

Sem EWIs relacionados.

Conversão para DATE usando { }

Descrição

A sintaxe a seguir converte uma cadeia de caracteres com formato de data para o tipo de dados DATE, colocando um d antes da definição da cadeia de caracteres entre chaves.

 SELECT {d '1233-10-10'}
Copy

Amostra de padrões da origem

Conversão para DATE usando chaves

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

Conversão para o tipo de dados INTERVAL

Descrição

O Snowflake não é compatível com o tipo de dados Interval, mas tem constantes INTERVAL que podem ser usadas em operações DateTime e outros usos podem ser emulados usando VARCHAR; o SnowConvert transformará as funções CAST no tipo de dados INTERVAL em um equivalente, dependendo do caso:

  • Quando o valor que está sendo convertido for do tipo Interval, será gerado um UDF para produzir o novo intervalo equivalente como uma cadeia de caracteres

  • Quando o valor for um literal, será gerada uma constante de intervalo Snowflake se a conversão for usada em uma operação de data e hora; caso contrário, será gerada uma cadeia de caracteres literal

  • Quando o valor for não-literal, será gerada uma conversão para cadeia de caracteres

Amostra de padrões da origem

Literais não-intervalados

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

Valores não literais e não intervalados

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

Conversão de intervalo para outro intervalo

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

Problemas conhecidos

Nenhum problema conhecido.

EWIs relacionados

Sem EWIs relacionados.

COALESCE

Descrição

A função coalesce é usada para retornar o primeiro elemento não nulo em uma lista. Para obter mais informações, consulte COALESCE.

COALESCE(element_1, element_2 [, element_3, ..., element_n])

Copy

As funções Teradata e Snowflake COALESCE permitem a combinação de parâmetros numéricos com cadeia de caracteres e data com carimbo de data/hora. No entanto, eles tratam esses dois casos de forma diferente:

  • Numeric junto com parâmetros de cadeia de caracteres: o Teradata converte todos os parâmetros numéricos em varchar, enquanto o Snowflake faz o oposto

  • Timestamp junto com parâmetros de data: o Teradata converte todos os carimbos de data/hora em data, enquanto o Snowflake faz o oposto

Para garantir a equivalência funcional no primeiro caso, todos os parâmetros numéricos são convertidos emstringusando a funçãoto_varchar, que leva em conta o formato dos números. No segundo caso, todos os carimbos de data/hora são convertidos em data usando to_date; o Teradata ignora o formato dos carimbos de data/hora ao convertê-los, portanto, ele é removido durante a transformação.

Amostra de padrões da origem

Parâmetros numéricos misturados com cadeia de caracteres

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

Carimbo de data/hora misturado com parâmetros de data

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

Problemas conhecidos

Nenhum problema conhecido_._

EWIs relacionados

CURRENT_TIMESTAMP

Gravidade

Low

Descrição

Os segundos fracionários são exibidos somente se forem explicitamente definidos no parâmetro de sessão TIME_OUTPUT_FORMAT.

Código de entrada:
 SELECT current_timestamp(4) at local;
Copy
Código de saída:
 SELECT
current_timestamp(4);
Copy

Recomendações

  • Verifique se o parâmetro de sessão TIME_OUTPUT____FORMAT está definido para obter o comportamento que deseja.

  • Se precisar de mais suporte, pode nos enviar um e-mail para snowconvert-support@snowflake.com

Problemas conhecidos

Não foram encontrados problemas.

EWIs Relacionados

Sem EWIs relacionados.

DAYNUMBER_OF_MONTH

Descrição

Retorna o número de dias decorridos desde o início do mês até a data fornecida. Para obter mais informações, consulte DAYNUMBER_OF_MONTH.

DAYNUMBER_OF_MONTH(expression [, calendar_name])

Copy

Tanto o Teradata quanto o Snowflake tratam a função DAYNUMBER_OF_MONTH da mesma forma, exceto em um caso:

  • O calendário ISO: Um mês ISO tem 4 ou 5 semanas completas. Para obter mais informações, consulte Sobre a computação ISO.

Para garantir a equivalência funcional, uma função definida pelo usuário (UDF) é adicionada para o caso do calendário ISO.

Amostra de padrões da origem

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

Calendário 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

Problemas conhecidos

Não foram encontrados problemas.

EWIs Relacionados

Sem EWIs relacionados.

FROM_BYTES

Descrição

A função FROM_BYTES codifica uma sequência de bits em uma sequência de caracteres que representam sua codificação. Para obter mais informações, consulte FROM_BYTES(codificação).

O Snowflake não tem suporte para a função FROM_BYTES. No entanto, algumas soluções alternativas podem ser feitas para as ocorrências mais comuns dessa função.

Amostra de padrões da origem

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

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Problemas conhecidos

  1. O parâmetro de formato TO_NUMBER deve corresponder aos dígitos da cadeia de entrada.

  2. Não há função integrada equivalente funcional para FROM_BYTES ao codificar para ANSI

EWIs relacionados

  1. SSC-EWI-0031: FUNCTION NOT SUPPORTED

GETQUERYBANDVALUE

Descrição

A função GetQueryBandValue pesquisa uma chave de nome dentro da banda de consulta e retorna seu valor associado, se presente. Ela pode ser usada para pesquisar dentro da transação, da sessão, do perfil ou de qualquer par de chave-valor da banda de consulta.

Para obter mais informações sobre essa função, consulte GetQueryBandValue na documentação do Teradata.

[SYSLIB.]GetQueryBandValue([QueryBandIn,] SearchType, Name);

Copy

Amostra de padrões da origem

Dados de configuração

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

GetQueryBandValue com o parâmetro 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 sem o parâmetro 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

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Problemas conhecidos

1. GetQueryBandValue sem o parâmetro QueryBandIn, compatível apenas com a sessão

O Teradata permite a definição de bandas de consulta nos níveis de transação, sessão ou perfil. Se GetQueryBandValue for chamado sem especificar uma banda de consulta de entrada, o Teradata verificará automaticamente as bandas de consulta de transação, sessão ou perfil, dependendo do valor do parâmetro SearchType.

No Snowflake, o equivalente mais próximo das bandas de consulta são as tags de consulta, que podem ser especificadas para sessão, usuário e conta.

Devido a essas diferenças, a implementação de GetQueryBandValue sem o parâmetro QueryBandIn considera apenas a tag de consulta da sessão e pode não funcionar como esperado para outros tipos de pesquisa.

EWIs relacionados

Sem EWIs relacionados.

JSON_CHECK

Descrição

A função JSON_CHECK verifica se há JSON válido na cadeia de caracteres.

Para obter mais informações sobre o Teradata JSON_CHECK, veja aqui.

 [TD_SYSFNLIB.]JSON_CHECK(string_expr);
Copy

Amostra de padrão de origem

Padrão de origem básico

Teradata
 SELECT JSON_CHECK('{"key": "value"}');
Copy
Script Snowflake
 SELECT
IFNULL(CHECK_JSON('{"key": "value"}'), 'OK');
Copy

JSON_CHECK dentro de transformação CASE

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

Problemas conhecidos

Não foram encontrados problemas.

EWIs Relacionados

Sem EWIs relacionados.

JSON_EXTRACT

Descrição

De acordo com a documentação do Teradata, essas funções usam a sintaxe de consultaJSONPath para solicitar informações sobre uma parte de uma instância JSON. A entidade desejada pode ser qualquer parte de uma instância JSON, como um par nome/valor, um objeto, uma matriz, um elemento de matriz ou um valor.

Para obter mais informações sobre o Teradata JSONExtractValue, JSONExtractLargeValue e JSONExtract, veja aqui.

 JSON_expr.JSONExtractValue(JSONPath_expr)

JSON_expr.JSONExtractLargeValue(JSONPath_expr)

JSON_expr.JSONExtract(JSONPath_expr)
Copy

O JSON_EXTRACT_UDF é uma implementação do Snowflake da especificação JSONPath que usa uma versão modificada da implementação JavaScript original desenvolvida por Stefan Goessner.

Amostra de padrão de origem

Teradata
 SELECT
    Store.JSONExtract('$..author') as AllAuthors,
    Store.JSONExtractValue('$..book[2].title') as ThirdBookTitle,
    Store.JSONExtractLargeValue('$..book[2].price') as ThirdBookPrice
FROM BookStores;
Copy
Script 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

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Problemas conhecidos

1. Elements inside JSONs may not retain their original order.

Os elementos dentro de um JSON são ordenados por suas chaves quando inseridos em uma tabela. Portanto, os resultados da consulta podem ser diferentes. No entanto, isso não afeta a ordem das matrizes dentro do JSON.

Por exemplo, se o JSON original for:

 { 
   "firstName":"Peter",
   "lastName":"Andre",
   "age":31,
   "cities": ["Los Angeles", "Lima", "Buenos Aires"]
}
Copy

Usando o Snowflake PARSE_JSON() que interpreta uma cadeia de caracteres de entrada como um documento JSON, produzindo um valor VARIANT. O JSON inserido será:

 { 
   "age": 31,
   "cities": ["Los Angeles", "Lima", "Buenos Aires"],
   "firstName": "Peter",
   "lastName": "Andre" 
}
Copy

Observe como «age» é agora o primeiro elemento. No entanto, a matriz de «cities» mantém sua ordem original.

EWIs relacionados

Sem EWIs relacionados.

JSON_TABLE

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

Cria uma tabela com base no conteúdo de um documento JSON. Consulte a documentação 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

A conversão de JSON_TABLE tem as considerações mostradas abaixo:

  • ROW_NUMBER() é um equivalente de colunas ordinais no Snowflake.

  • No Teradata, a segunda coluna de JSON_TABLE deve ser do tipo JSON, pois as colunas geradas substituem a segunda coluna. Por esse motivo, o Snowconvert presume que a coluna tem o tipo correto e a usa para a transformação.

Amostra de padrões da origem

Dados de configuração

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

Código do padrão 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

Problemas conhecidos

1. O caminho JSON em COLEXPR não pode ter vários acessos de asterisco

O caminho JSON das colunas não pode ter várias listas com acesso por asterisco, por exemplo: $.Names[*].FullNames[*]. Por outro lado, o caminho JSON de ROWEXP pode ter isso.

2. A estrutura JSON definida no literal COLEXPR deve ser um JSON válido

Se não for esse o caso, o usuário será avisado de que o JSON está mal formado.

EWIs relacionados

Sem EWIs relacionados.

NEW JSON

Descrição

Aloca uma nova instância de um tipo de dados JSON. Para obter mais informações, consulte Expressão de construtor NEW JSON.

NEW JSON ( [ JSON_string_spec | JSON_binary_data_spec ] )

JSON_string_spec := JSON_String_literal [, { LATIN | UNICODE | BSON | UBJSON } ]

JSON_binary_data_spec := JSON_binary_literal [, { BSON | UBJSON } ]

Copy

O segundo parâmetro da função NEW JSON é sempre omitido pelo SnowConvert, pois o Snowflake funciona somente com UTF-8.

Amostra de padrões da origem

NEW JSON com dados de cadeia de caracteres

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

Problemas conhecidos

1. O segundo parâmetro não é suportado

O segundo parâmetro da função usada para especificar o formato do JSON resultante não é compatível, pois o Snowflake suporta apenas UTF-8, o que pode resultar em diferenças funcionais para alguns usos da função.

2. JSON com dados BINARY não é suportado

O Snowflake não oferece suporte à análise de dados binários para criar um valor JSON. O usuário será avisado quando o SnowConvert encontrar um NEW JSON com dados binários.

EWIs relacionados

  1. SSC-EWI-TD0039: Formato de entrada não suportado.

NVP

Descrição

Extrai o valor do par chave-valor em que a chave corresponde à enésima ocorrência do nome especificado para pesquisa. Consulte NVP.

[TD_SYSFNLIB.] NVP (
in_string,
name_to_search
[, name_delimiters ]
[, value_delimiters ]
[, occurrence ]
)

Copy

Amostra de padrões da origem

Caso básico de 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 com parâmetros opcionais ignorados

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 com espaços nos delimitadores

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 com delimitadores não literais

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

Problemas conhecidos

1. Delimitadores com espaços (\ ) precisam ter a barra invertida no Snowflake

No Teradata, os delimitadores que incluem espaço os especificam usando «\ « (consulte NVP com espaços nos delimitadores), conforme mostrado nos exemplos, no Teradata não é necessário escapar a barra invertida, no entanto, isso é necessário no Snowflake. O escape das barras invertidas no delimitador pode ser feito automaticamente pelo SnowConvert, mas somente se os valores do delimitador forem cadeias de caracteres literais; caso contrário, o usuário será avisado de que as barras invertidas não puderam ser escapadas e que isso pode causar resultados diferentes no Snowflake.

EWIs relacionados

  1. SSC-FDM-TD0008: Os delimitadores não literais com espaços precisam que a barra invertida seja escapada no snowflake.

OVERLAPS

Descrição

De acordo com a documentação do Teradata, o operador OVERLAPS compara duas ou mais expressões de período. Se elas se sobrepuserem, ele retornará true.

Para obter mais informações sobre OVERLAPS do Teradata, veja aqui.

 period_expression
OVERLAPS
period_expression
Copy

PERIOD_OVERLAPS_UDF é uma implementação do Snowflake do operador OVERLAPS no Teradata.

Amostra de padrão de origem

Teradata

 SELECT 
    PERIOD(DATE '2009-01-01', DATE '2010-09-24') 
    OVERLAPS
    PERIOD(DATE '2009-02-01', DATE '2009-06-24');
Copy

Script 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

Problemas conhecidos

1. Unsupported Period Expressions

As expressões PERIOD(TIME WITH TIME ZONE) e PERIOD(TIMESTAMP WITH TIME ZONE) ainda não são compatíveis.

EWIs relacionados

  1. SSC-EWI-TD0053: O Snowflake não é compatível com o tipo de dado period; em vez disso, todos os períodos são tratados como varchar

P_INTERSECT

Descrição

De acordo com a documentação do Teradata, o operador P_INTERSECT compara duas ou mais expressões de período. Se elas se sobrepuserem, ele retornará a parte comum das expressões de período.

Para obter mais informações sobre o P_INTERSECT do Teradata, veja aqui.

 period_expression
P_INTERSECT
period_expression
Copy

O PERIOD_INTERSECT_UDF é uma implementação do Snowflake do operador P_INTERSECT no Teradata.

Amostra de padrão de origem

Teradata

 SELECT 
    PERIOD(DATE '2009-01-01', DATE '2010-09-24') 
    P_INTERSECT 
    PERIOD(DATE '2009-02-01', DATE '2009-06-24');
Copy

Script 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

Problemas conhecidos

1. Unsupported Period Expressions

As expressões PERIOD(TIME WITH TIME ZONE) e PERIOD(TIMESTAMP WITH TIME ZONE) ainda não são compatíveis.

EWIs relacionados

  1. SSC-EWI-TD0053: O Snowflake não é compatível com o tipo de dado period; em vez disso, todos os períodos são tratados como varchar

PIVOT

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

A função pivot é usada para transformar as linhas de uma tabela em colunas. Para obter mais informações, consulte a documentação doPIVOT do 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

Amostra de padrões da origem

Dados de configuração

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

Transformação de PIVOT básica

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 com transformação de aliases

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

Problemas conhecidos

1. Cláusula WITH não suportada

No momento, não há suporte para o uso da cláusula WITH.

2. Não há suporte para pivotar sobre várias colunas dinâmicas

O Snowconvert está transformando a função PIVOT na função PIVOT do Snowflake, que só suporta a aplicação da função em uma única coluna.

3. Não há suporte para a dinamização com várias funções agregadas

A função PIVOT no Snowflake suporta apenas a aplicação de uma função agregada sobre os dados.

4. Não há suporte para subconsulta na cláusula IN

A cláusula IN da função Snowflake PIVOT não aceita subconsultas.

5. Os aliases são suportados somente se todos os elementos da cláusula IN o tiverem e a especificação da tabela estiver presente

Para que os nomes das colunas com aliases sejam equivalentes, o SnowConvert exige que todos os valores especificados na cláusula IN tenham um alias especificado e que a especificação da tabela esteja presente no código de entrada, o que é necessário para que o SnowConvert possa criar com êxito a lista de aliases para a tabela resultante.

EWIs relacionados

  1. SSC-EWI-0015: Não há suporte para o formulário de instrução pivot/unpivot de entrada

RANK

Descrição

RANK classifica um conjunto de resultados e identifica a classificação numérica de cada linha no resultado. O único argumento para RANK é a coluna ou colunas de classificação, e a função retorna um número inteiro que representa a classificação de cada linha no resultado. (RANK no Teradata)

Sintaxe do Teradata

 RANK ( sort_expression [ ASC | DESC ] [,...] )
Copy

Sintaxe do Snowflake

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

Amostra de padrão de origem

Dados de configuração

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() usando ordem ASC, DESC e DEFAULT

Teradata

Aviso

Observe que o valor padrão de pedido do Teradata ao chamar RANK() é DESC. No entanto, o padrão no Snowflake é ASC. Assim, DESC é adicionado na conversão de RANK() quando nenhuma ordem é especificada.

 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

Problemas conhecidos

Não foram encontrados problemas.

EWIs Relacionados

Sem EWIs relacionados.

Funções Regex

Descrição

Tanto o Teradata quanto o Snowflake oferecem suporte a funções que aplicam expressões regulares em entradas varchar. Consulte a documentação do Teradata e a documentação do Snowflake para obter mais detalhes.

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

Amostra de padrões da origem

Dados de configuração

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

Exemplo de transformação 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

Problemas conhecidos

1. O Snowflake suporta apenas expressões regulares POSIX

O usuário será avisado quando o SnowConvert encontrar uma expressão regular que não sejaPOSIX.

2. A opção “l” do Teradata «match_arg» não é compatível com o Snowflake

A opção “l” não tem contrapartida no Snowflake e o usuário será avisado se o SnowConvert as encontrar.

3. O tamanho fixo do tipo de dados CHAR pode causar um comportamento diferente

Algumas funções regex no Teradata tentarão corresponder a coluna inteira do tipo de dados CHAR em uma tabela, mesmo que alguns dos caracteres da coluna tenham ficado vazios devido à inserção de uma cadeia de caracteres menor. No Snowflake, isso não acontece porque o tipo de dados CHAR é de tamanho variável.

4. REGEXP_SPLIT_TO_TABLE não suportado

No momento, a função não é compatível com o Snowflake.

EWIs relacionados

  1. SSC-FDM-0007: Elemento com dependências ausentes.

  2. SSC-FDM-TD0016: O valor “l” para o parâmetro “match_arg” não é compatível com o Snowflake.

STRTOK_SPLIT_TO_TABLE

Descrição

Divide uma cadeia de caracteres em uma tabela usando os delimitadores fornecidos. Para obter mais informações, consulte STRTOK_SPLIT_TO_TABLE.

[TD_SYSFNLIB.] STRTOK_SPLIT_TO_TABLE ( inkey, instring, delimiters )
  RETURNS ( outkey, tokennum, token )

Copy

Amostra de padrões da origem

Dados de configuração

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

Transformação de 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

Problemas conhecidos

Nenhum problema conhecido.

EWIs Relacionados

Sem EWIs relacionados.

SUBSTRING

Descrição

Extrai uma substring de uma determinada cadeia de caracteres de entrada. Para obter mais informações, consulte SUBSTRING/SUBSTR.

SUBSTRING(string_expr FROM n1 [FOR n2])

SUBSTR(string_expr, n1, [, n2])

Copy

Quando o valor para começar a obter a substring (n1) for menor que um SUBSTR_UDF é inserido em seu lugar.

Amostra de padrões da origem

Transformação de 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 relacionados

Sem EWIs relacionados.

TD_UNPIVOT

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

TD_UNPIVOT no Teradata pode desvincular várias colunas de uma vez, enquanto o Snowflake UNPIVOT só pode desvincular uma única coluna. A funcionalidade unpivot é usada para transformar colunas da tabela especificada em linhas. Para obter mais informações, consulte 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

A transformação a seguir é capaz de gerar uma consulta SQL no Snowflake que desdobra várias colunas ao mesmo tempo, da mesma forma que funciona no Teradata.

Amostra de padrões da origem

Título dos dados de configuração

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

Transformação de 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

Problemas conhecidos

  1. TDa cláusula _UNPIVOT com INCLUDE_NULLS definida como YES não é suportada

    A função Snowflake UNPIVOT usada na transformação sempre ignorará os valores nulos, e o usuário será avisado de que a cláusula INCLUDE_NULLS não é compatível quando estiver definida como YES.

  2. As informações da tabela são necessárias para transformar corretamente a função

    O SnowConvert precisa do nome das colunas que estão sendo usadas na função TD_UNPIVOT; se o usuário não incluir a lista de colunas na expressão query_expression da função, mas fornecer o nome da tabela que está sendo desvinculada, ele tentará recuperar os nomes das colunas na definição da tabela. Se os nomes não puderem ser encontrados, o usuário será avisado de que a consulta resultante pode estar perdendo colunas no resultado.

EWIs relacionados

  1. SSC-EWI-TD0061: A transformação TD_UNPIVOT requer informações de coluna que não puderam ser encontradas; colunas ausentes no resultado.

TO_CHAR

Descrição

A função TO_CHAR converte um valor DateTime ou numérico em uma cadeia de caracteres. Para obter mais informações, consulte TO_CHAR(Numeric) e 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

Tanto o Snowflake quanto o Teradata têm sua própria versão da função TO_CHAR. No entanto, o Teradata oferece suporte a vários formatos que não são nativamente compatíveis com o Snowflake. Para dar suporte a esses elementos de formato, o SnowConvert usa as funções incorporadas do Snowflake e as funções personalizadas UDFs para gerar uma expressão de concatenação que produz a mesma cadeia de caracteres que a função original TO_CHAR no Teradata.

Amostra de padrões da origem

Transformação de 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

Transformação de 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

Problemas conhecidos

1. Formatos com comportamentos diferentes ou sem suporte

A Teradata oferece uma lista extensa de elementos de formato que podem apresentar um comportamento diferente no Snowflake após a transformação da função TO_CHAR. Para obter a lista de elementos com comportamentos diferentes ou sem suporte, consulte SSC-EWI-TD0029.

EWIs relacionados

  1. SSC-FDM-TD0029: Os formatos suportados pelo Snowflake para TO_CHAR diferem do Teradata e podem falhar ou ter um comportamento diferente.

XMLAGG

Descrição

Construa um valor XML realizando uma agregação de várias linhas. Para obter mais informações, consulte XMLAGG.

XMLAGG (
  XML_value_expr
  [ ORDER BY order_by_spec [,...] ]
  [ RETURNING { CONTENT | SEQUENCE } ]
)

order_by_spec := sort_key [ ASC | DESC ] [ NULLS { FIRST | LAST } ]

Copy

Amostra de padrões da origem

Dados de configuração

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

Transformação de 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

Problemas conhecidos

1. A cláusula RETURNING não é suportada no momento.

O usuário será avisado de que a conversão da cláusula returning será adicionada no futuro.

EWIs Relacionados

Sem EWIs relacionados.