SnowConvert AI - Teradata - Funções internas

Esta página fornece uma descrição da tradução das funções internas do Teradata para Snowflake

Nota

Esta página lista apenas as funções que já são transformadas pelo SnowConvert AI. Se uma função da documentação do Teradata não estiver listada aqui, ela deve ser considerada incompatível.

Para mais informações sobre funções internas e seus equivalentes no Snowflake, consulte também [Funções internas comuns](../../general/ built-in-functions.md).

Nota

Algumas funções do Teradata não têm um equivalente direto no Snowflake, portanto, elas são transformadas em uma UDF equivalente funcional, que podem ser facilmente detectadas pelo sufixo _UDF no nome da função. Para mais informações sobre as UDFs que o SnowConvert AI usa, 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

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

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

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

Teradata

Snowflake

Observação

BITAND

BITAND

BITNOT

BITNOT

BITOR

BITOR

BITXOR

BITXOR

GETBIT

GETBIT

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

Verifique SSC-EWI-TD0068 para mais detalhes sobre esta transformação

SESSION

CURRENT_SESSION

TIME

CURRENT_TIME

USER

CURRENT_USER

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

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)

Funções de caso

Teradata

Snowflake

Observação

COALESCE

COALESCE

Verifique Coalesce.

NULLIF

NULLIF

Funções de comparação

Teradata

Snowflake

Observação

DECODE

DECODE

GREATEST

GREATEST

LEAST

LEAST

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.

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

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

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

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

Funções de tratamento de nulos

Teradata

Snowflake

Observação

NVL

NVL

NVL2

NVL2

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

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

Funções de banda de consulta

Teradata

Snowflake

Observação

GETQUERYBANDVALUE

GETQUERYBANDVALUE_UDF

Verifique GETQUERYBANDVALUE

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

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

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 internas do sistema pelo Teradata, mas são transformadas pelo SnowConvert AI

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.

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

Consulta

 SELECT COALESCE(125, 'hello', cast(850 as format '-999'));
Copy

Resultado

COLUMN1|
-------+
125    |
Copy
Snowflake

Consulta

SELECT
 COALESCE(TO_VARCHAR(125), 'hello', TO_VARCHAR(850, '9000'));
Copy

Resultado

COLUMN1|
-------+
125    |
Copy

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

Teradata

Consulta

 SELECT COALESCE(cast(TIMESTAMP '2021-09-14 10:14:59' as format 'HH:MI:SSBDD-MM-YYYY'), current_date);

Resultado

COLUMN1    |
-----------+
2021-09-14 |
Copy
Snowflake

Consulta

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

Resultado

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, envie 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

Consulta

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

Resultado

COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22     |22     |22     |22     |
Copy

Snowflake

Consulta

SELECT
    DAYOFMONTH(DATE'2022-12-22'),
    DAYOFMONTH(DATE'2022-12-22'),
    DAYOFMONTH(DATE'2022-12-22'),
    DAYOFMONTH(DATE'2022-12-22');
Copy

Resultado

COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22     |22     |22     |22     |
Copy

Calendário ISO

Teradata

Consulta

SELECT DAYNUMBER_OF_MONTH (DATE'2022-12-22', 'ISO');
Copy

Resultado

COLUMN1|
-------+
25     |
Copy
Snowflake

Consulta

SELECT
PUBLIC.DAYNUMBER_OF_MONTH_UDF(DATE'2022-12-22');
Copy

Resultado

COLUMN1|
-------+
25     |
Copy

Problemas conhecidos

Não foram encontrados problemas.

EWIs Relacionados

Sem EWIs relacionados.

FROM_BYTES

Especificação de tradução para transformar a função TO_CHAR em uma concatenação de função equivalente no Snowflake

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

Consulta
 SELECT 
FROM_BYTES('5A1B'XB, 'base10'), --returns '23067'
FROM_BYTES('5A3F'XB, 'ASCII'), --returns 'Z\ESC '
FROM_BYTES('5A1B'XB, 'base16'); -- returns '5A1B'
Copy
Resultado
COLUMN1    | COLUMN2    | COLUMN3 |
-----------+------------+---------+
23067      |  Z\ESC     | 5A1B    |

Copy
Snowflake
Consulta
 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
Resultado
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

Especificação de tradução para a transformação de GetQueryBandValue para Snowflake

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
Consulta
 SET QUERY_BAND = 'hola=hello;adios=bye;' FOR SESSION;
Copy
Snowflake
Consulta
 ALTER SESSION SET QUERY_TAG = 'hola=hello;adios=bye;';
Copy

GetQueryBandValue com o parâmetro QueryBandIn

Teradata
Consulta
 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
Resultado
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200  | Mark200  | SaraDB   | Peter3   | DbAdmin  |          |
+----------+----------+----------+----------+----------+----------+

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

Copy

GetQueryBandValue sem o parâmetro QueryBandIn

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

Copy
Snowflake
Consulta
 SELECT
GETQUERYBANDVALUE_UDF('hola') as Example1,
GETQUERYBANDVALUE_UDF('adios') as Example2;
Copy
Resultado
+----------+----------+
| 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

Consulta

SELECT JSON_CHECK('{"key": "value"}');
Copy
Script Snowflake

Consulta

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

JSON_CHECK dentro de transformação CASE

Teradata

Consulta

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

Consulta

SELECT
CASE
WHEN UPPER(RTRIM(IFNULL(CHECK_JSON('{}'), 'OK'))) = UPPER(RTRIM('OK'))
THEN 'OKK' ELSE 'NOT OK'
END;
Copy

Problemas conhecidos

Não foram encontrados problemas.

EWIs Relacionados

Sem EWIs relacionados.

JSON_EXTRACT

Referência de tradução para converter as funções do Teradata JSONExtractValue, JSONExtractLargeValue e JSONExtract em Script Snowflake.

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
Consulta
 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
Consulta
 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

Especificação de tradução para a transformação de JSON_TABLE em uma consulta equivalente no Snowflake

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, porque as colunas geradas substituem a segunda coluna. Por esse motivo, o SnowConvert AI assume que a coluna tem o tipo correto e o utiliza para a transformação.

Amostra de padrões da origem

Dados de configuração

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

Copy
Snowflake
Consulta
 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
Resultado
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 omitida pelo SnowConvert AI, visto que o Snowflake funciona somente com UTF-8.

Amostra de padrões da origem

NEW JSON com dados de cadeia de caracteres

Teradata

Consulta

SELECT NEW JSON ('{"name" : "cameron", "age" : 24}'),
NEW JSON ('{"name" : "cameron", "age" : 24}', LATIN);
Copy

Resultado

COLUMN1

COLUMN2

{«age»:24,»name»:»cameron»}

{«age»:24,»name»:»cameron»}

Snowflake

Consulta

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

Resultado

COLUMN1

COLUMN2

{«age»:24,»name»:»cameron»}

{«age»:24,»name»:»cameron»}

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 é incompatível com a análise de dados binários para criar um valor JSON. O usuário será avisado quando o SnowConvert AI encontrar um NEW JSON com dados binários.

EWIs relacionados

  1. SSC-EWI-TD0039: formato de entrada incompatível.

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

Consulta

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

Resultado

COLUMN1        | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world!  | Susana  |
Copy
Snowflake

Consulta

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

Resultado

COLUMN1        | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world!  | Susana  |
Copy

NVP com parâmetros opcionais ignorados

Teradata

Consulta

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

Resultado

COLUMN1 | COLUMN2 | COLUMN3     |
--------+---------+-------------+
Green   | Blue    | Los Angeles |
Copy
Snowflake

Consulta

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

Resultado

COLUMN1 | COLUMN2 | COLUMN3     |
--------+---------+-------------+
Green   | Blue    | Los Angeles |
Copy

NVP com espaços nos delimitadores

Teradata

Consulta

SELECT
NVP('store = whole foods&&store: ?Bristol farms','store', '&&', '\ =\  :\ ?', 2),
NVP('Hello = bye|name = Lucas|Hello = world!', 'Hello', '|', '\ =\ ', 2);
Copy

Resultado

COLUMN1       | COLUMN2 |
--------------+---------+
Bristol farms | world!  |
Copy
Snowflake

Consulta

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

Resultado

COLUMN1       | COLUMN2 |
--------------+---------+
Bristol farms | world!  |
Copy

NVP com delimitadores não literais

Teradata

Consulta

SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
Copy
Snowflake

Consulta

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, incluindo o espaço, os especificam usando «\ « (consulte NVP com espaços em delimitadores), como mostrado nos exemplos. No Teradata não é necessário fazer o escape da barra invertida, no entanto, mas isto é necessário no Snowflake. O escape de barras invertidas no delimitador pode ser feito automaticamente usando o SnowConvert AI, mas somente se os valores delimitadores 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: delimitadores não literais com espaços precisam ter escape em sua barra invertida 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

Consulta

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

Script Snowflake

Consulta

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 dados de período; 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

Consulta

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

Script Snowflake

Consulta

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 dados de período; todos os períodos são tratados como varchar.

PIVOT

Especificação de tradução para o formulário de função PIVOT do Teradata para Snowflake

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
Consulta
 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
Consulta
 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
Consulta
 SELECT *
FROM star1 PIVOT (
	SUM(sales) FOR qtr                                                                                               
    IN ('Q1',                                                                                                     
    	'Q2', 
        'Q3')
)Tmp;
Copy
Resultado
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
Consulta
 SELECT
	*
FROM
	star1 PIVOT(
	SUM(sales) FOR qtr IN ('Q1',
	   	'Q2',
	       'Q3'))Tmp;
Copy
Resultado
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
Consulta
 SELECT *
FROM star1 PIVOT (
	SUM(sales) as ss1 FOR qtr                                                                                               
    IN ('Q1' AS Quarter1,                                                                                                     
    	'Q2' AS Quarter2, 
        'Q3' AS Quarter3)
)Tmp;
Copy
Resultado
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
Consulta
 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
Resultado
 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 AI está transformando a função PIVOT na função PIVOT no Snowflake, que só é compatível com 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 AI exige que todos os valores especificados na cláusula IN tem um alias especificado, e a especificação da tabela está presente no código de entrada, o que é necessário para o SnowConvert AI criar com sucesso a lista de alias para a tabela resultante.

EWIs relacionados

  1. SSC-EWI-0015: formato incompatível da instrução de entrada pivot/unpivot

RANK

Especificação de tradução para a transformação da função 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
Consulta
 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
Consulta
 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.

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

Consulta

CREATE TABLE regexpTable
(
    col1 CHAR(35)
);

INSERT INTO regexpTable VALUES('hola');
Copy
Snowflake

Consulta

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

Consulta

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

Resultado

COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala   |null   |1      |0      |
Copy
Snowflake

Consulta

--** 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

Resultado

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 AI encontrar uma expressão regular não POSIX.

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

A opção “l” não tem correspondente no Snowflake, portanto, o usuário será avisado se o SnowConvert AI encontrar algum.

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” é incompatí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

Consulta

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

Consulta

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

Consulta

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

Resultado

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

Consulta

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

Resultado

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

Consulta

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

Resultado

COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W  |Hel     |ello W  |Hel      |
Copy
Snowflake

Consulta

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

Resultado

COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W  |Hel     |ello W  |Hel      |
Copy

EWIs relacionados

Sem EWIs relacionados.

TD_UNPIVOT

Especificação de tradução para a transformação de TD_UNPIVOT em uma consulta equivalente no Snowflake

Nota

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

Descrição

TD_UNPIVOT, no Teradata, pode desarticular várias colunas de uma só vez, enquanto que UNPIVOT, no Snowflake, só pode desarticular uma única coluna**.** A funcionalidade unpivot é usada para transformar colunas da tabela especificada em linhas. Para 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
Consulta
 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
Consulta
 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
Consulta
 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
Resultado
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
Consulta
 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
Resultado
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.

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

O SnowConvert AI 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 query_expression da função, mas fornecer o nome da tabela sendo desarticulada, ele tentará recuperar os nomes das colunas da definição da tabela. Se os nomes não forem encontrados, o usuário será avisado de que pode estar faltando colunas no resultado da consulta.

EWIs relacionados

  1. SSC-EWI-TD0061: a transformação TD_UNPIVOT requer informações de coluna que não foram encontradas, faltam colunas 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 é compatível com muitos formatos que não são nativamente compatíveis com o Snowflake. Para oferecer compatibilidade com estes elementos de formato, o SnowConvert AI utiliza as funções internas do Snowflake e UDFs personalizadas para gerar uma expressão de concatenação que produz a mesma cadeia de caracteres que a função TO_CHAR original no Teradata.

Amostra de padrões da origem

Transformação de TO_CHAR(DateTime)

Teradata

Consulta

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

Resultado

COLUMN1    | COLUMN2    | COLUMN3           |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
Copy
Snowflake

Consulta

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

Resultado

COLUMN1    | COLUMN2    | COLUMN3           |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
Copy

Transformação de TO_CHAR(Numeric)

Teradata

Consulta

SELECT
TO_CHAR(1255.495),
TO_CHAR(1255.495, '9.9EEEE'),
TO_CHAR(1255.495, 'SC9999.9999', 'nls_iso_currency = ''EUR''');
Copy

Resultado

COLUMN1  | COLUMN2 | COLUMN3       |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |
Copy
Snowflake

Consulta

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

Resultado

COLUMN1  | COLUMN2 | COLUMN3       |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |
Copy

Problemas conhecidos

1. Formatos com comportamentos diferentes ou sem suporte

O Teradata oferece uma extensa lista de elementos de formato que podem mostrar 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 incompatíveis, consulte SSC-EWI-TD0029.

EWIs relacionados

  1. SSC-FDM-TD0029: os formatos compatíveis do 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

Consulta

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

Consulta

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

Consulta

select 
    xmlagg(o_orderkey order by o_totalprice desc) (varchar(10000))
from orders
where o_totalprice > 5;
Copy

Resultado

COLUMN1 |
--------+
4 3 1 2 |
Copy
Snowflake

Consulta

SELECT
    LEFT(TO_VARCHAR(LISTAGG ( o_orderkey, ' ')
    WITHIN GROUP(
 order by o_totalprice DESC NULLS LAST)), 10000)
    from
    orders
    where o_totalprice > 5;
Copy

Resultado

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.

CAST

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

O Teradata, quando convertido para varchar, usa formatos padrão para cada tipo de dados numérico, portanto, o SnowConvert AI adiciona formatos para manter a equivalência entre plataformas.

Amostra de padrões da origem

BYTEINT

Teradata

Consulta

SELECT '"'||cast(cast(12 as BYTEINT) as varchar(10))||'"';
Copy

Resultado

(('"'||12)||'"')|
----------------+
"12"            |
Copy
Snowflake

Consulta

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

Resultado

"'""'|| LEFT(TO_VARCHAR(CAST(12 AS BYTEINT), 'TM'), 10) ||'""'"
---------------------------------------------------------------
"12"            
Copy

SMALLINT

Teradata

Consulta

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

Resultado

(('"'||123)||'"')|
-----------------+
"123"            |
Copy
Snowflake

Consulta

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

Resultado

"'""'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"123"

INTEGER

Teradata

Consulta

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

Resultado

(('"'||12345)||'"')|
-------------------+
"12345"            |
Copy
Snowflake

Consulta

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

Resultado

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

BIGINT

Teradata

Consulta

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

Resultado

(('"'||12345)||'"')|
-------------------+
"12345"            |
Copy
Snowflake

Consulta

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

Resultado

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

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

Teradata

Consulta

SELECT '"'||cast(cast(12345 as DECIMAL) as varchar(10))||'"',
       '"'||cast(cast(12345 as DECIMAL(12, 2)) as varchar(10))||'"';
Copy

Resultado

(('"'||12345)||'"')|(('"'||12345)||'"')|
-------------------+-------------------+
"12345."           |"12345.00"         |
Copy
Snowflake

Consulta

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

Resultado

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

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

Consulta

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

Resultado

COLUMN1          |COLUMN2
-----------------+--------------+
"-.10"           |".10"         |
Copy

Snowflake

Consulta

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

Resultado

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

Conversão para data

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

Snowflake

Conversão para data

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 AI transformará funções CAST para o 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 sem intervalo

Teradata

Consulta

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

Resultado

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

Consulta

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

Resultado

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 intervalos

Teradata

Consulta

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

Resultado

DATETIME_OPERATION  | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-11-04 20:30:00 | 20 10                      |
Copy
Snowflake

Consulta

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

Resultado

DATETIME_OPERATION      | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-11-04 20:30:00.000 | 20 10                      |
Copy

Conversão de intervalo para outro intervalo

Teradata

Consulta

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

Resultado

DATETIME_OPERATION  | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-10-19 13:30:00 | 4 03                       |
Copy
Snowflake

Consulta

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

Resultado

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.