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 |
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 |
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 |
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 |
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”) |
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 |
|
TD_DAY_OF_WEEK |
TD_DAY_OF_WEEK_UDF |
|
TD_DAY_OF_YEAR |
DAYOFYEAR |
|
TD_MONTH_OF_CALENDAR(DateTimeValue) |
TD_MONTH_OF_CALENDAR_UDF(DateTimeValue) |
|
TD_WEEK_OF_CALENDAR(DateTimeValue) |
TD_WEEK_OF_CALENDAR_UDF(DateTimeValue) |
|
TD_WEEK_OF_YEAR |
WEEK_OF_YEAR_UDF |
|
TD_YEAR_BEGIN(DateTimeValue) |
YEAR_BEGIN_UDF(DateTimeValue) |
|
TD_YEAR_BEGIN(DateTimeValue, “ISO”) |
YEAR_BEGIN_ISO_UDF(DateTimeValue) |
|
TD_YEAR_END(DateTimeValue) |
YEAR_END_UDF(DateTimeValue) |
|
TD_YEAR_END(DateTimeValue, “ISO”) |
YEAR_END_ISO_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_MONTH(DateTimeValue) |
WEEKNUMBER_OF_MONTH_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_QUARTER(DateTimeValue) |
WEEKNUMBER_OF_QUARTER_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_QUARTER(DateTimeValue, “ISO”) |
WEEKNUMBER_OF_QUARTER_ISO_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_QUARTER(DateTimeValue, “COMPATIBLE”) |
WEEKNUMBER_OF_QUARTER_COMPATIBLE_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_YEAR(DateTimeValue) |
WEEK_OF_YEAR_UDF(DateTimeValue) |
|
WEEKNUMBER_OF_YEAR(DateTimeValue, “COMPATIBLE”) |
WEEK_OF_YEAR_COMPATIBLE_UDF(DateTimeValue) |
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 |
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 |
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 |
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 |
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_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 |
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 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');
Retorna 4, enquanto o equivalente CHARINDEX no Snowflake:
SELECT CHARINDEX('5', 35);
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ção
TO_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'));
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])
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'));
Resultado
COLUMN1|
-------+
125 |
Snowflake¶
Consulta
SELECT
COALESCE(TO_VARCHAR(125), 'hello', TO_VARCHAR(850, '9000'));
Resultado
COLUMN1|
-------+
125 |
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 |
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());
Resultado
COLUMN1 |
-----------+
2021-09-14 |
Problemas conhecidos¶
Nenhum problema conhecido_._
EWIs relacionados¶
SSC-EWI-TD0025: formato de saída incompatível.
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;
Código de saída:¶
SELECT
CURRENT_TIMESTAMP(4);
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])
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');
Resultado
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22 |22 |22 |22 |
Snowflake¶
Consulta
SELECT
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22');
Resultado
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22 |22 |22 |22 |
Calendário ISO¶
Teradata¶
Consulta
SELECT DAYNUMBER_OF_MONTH (DATE'2022-12-22', 'ISO');
Resultado
COLUMN1|
-------+
25 |
Snowflake¶
Consulta
SELECT
PUBLIC.DAYNUMBER_OF_MONTH_UDF(DATE'2022-12-22');
Resultado
COLUMN1|
-------+
25 |
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'
Resultado¶
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+---------+
23067 | Z\ESC | 5A1B |
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'
Resultado¶
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+---------+
23067 | Z\ESC | 5A1B |
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Problemas conhecidos¶
O parâmetro de formato TO_NUMBER deve corresponder aos dígitos da cadeia de entrada.
Não há função integrada equivalente funcional para FROM_BYTES ao codificar para ANSI
EWIs relacionados¶
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);
Amostra de padrões da origem¶
Dados de configuração¶
Teradata¶
Consulta¶
SET QUERY_BAND = 'hola=hello;adios=bye;' FOR SESSION;
Snowflake¶
Consulta¶
ALTER SESSION SET QUERY_TAG = 'hola=hello;adios=bye;';
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;
Resultado¶
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200 | Mark200 | SaraDB | Peter3 | DbAdmin | |
+----------+----------+----------+----------+----------+----------+
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;
Resultado¶
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200 | Mark200 | SaraDB | Peter3 | DbAdmin | |
+----------+----------+----------+----------+----------+----------+
GetQueryBandValue sem o parâmetro QueryBandIn¶
Teradata¶
Consulta¶
SELECT
GETQUERYBANDVALUE(2, 'hola') as Example1,
GETQUERYBANDVALUE(2, 'adios') as Example2;
Resultado¶
+----------+----------+
| EXAMPLE1 | EXAMPLE2 |
+----------+----------+
| hello | bye |
+----------+----------+
Snowflake¶
Consulta¶
SELECT
GETQUERYBANDVALUE_UDF('hola') as Example1,
GETQUERYBANDVALUE_UDF('adios') as Example2;
Resultado¶
+----------+----------+
| EXAMPLE1 | EXAMPLE2 |
+----------+----------+
| hello | bye |
+----------+----------+
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);
Amostra de padrão de origem¶
Padrão de origem básico¶
Teradata¶
Consulta
SELECT JSON_CHECK('{"key": "value"}');
Script Snowflake¶
Consulta
SELECT
IFNULL(CHECK_JSON('{"key": "value"}'), 'OK');
JSON_CHECK dentro de transformação CASE¶
Teradata¶
Consulta
SELECT CASE WHEN JSON_CHECK('{}') = 'OK' then 'OKK' ELSE 'NOT OK' END;
Script Snowflake¶
Consulta
SELECT
CASE
WHEN UPPER(RTRIM(IFNULL(CHECK_JSON('{}'), 'OK'))) = UPPER(RTRIM('OK'))
THEN 'OKK' ELSE 'NOT OK'
END;
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)
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;
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;
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"]
}
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"
}
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 [,...])]
)
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"}
]
}'));
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"}
]
}')));
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);
Resultado¶
ID | Song name | Genre |
---+------------+-------+
1 | Late night | Jazz |
---+------------+-------+
1 | Wake up | Rock |
---+------------+-------+
1 | Who am I | Rock |
---+------------+-------+
1 | Raining | Blues |
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;
Resultado¶
ID | Song name | Genre |
---+------------+-------+
1 | Late night | Jazz |
---+------------+-------+
1 | Wake up | Rock |
---+------------+-------+
1 | Who am I | Rock |
---+------------+-------+
1 | Raining | Blues |
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 } ]
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);
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}'));
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¶
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 ]
)
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);
Resultado
COLUMN1 | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world! | Susana |
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);
Resultado
COLUMN1 | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world! | Susana |
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', '#', '=');
Resultado
COLUMN1 | COLUMN2 | COLUMN3 |
--------+---------+-------------+
Green | Blue | Los Angeles |
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);
Resultado
COLUMN1 | COLUMN2 | COLUMN3 |
--------+---------+-------------+
Green | Blue | Los Angeles |
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);
Resultado
COLUMN1 | COLUMN2 |
--------------+---------+
Bristol farms | world! |
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);
Resultado
COLUMN1 | COLUMN2 |
--------------+---------+
Bristol farms | world! |
NVP com delimitadores não literais¶
Teradata¶
Consulta
SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
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 ***/;
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¶
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
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');
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 ***/!!!;
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¶
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
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');
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 ***/!!!;
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¶
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
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);
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);
Transformação de PIVOT básica¶
Teradata¶
Consulta¶
SELECT *
FROM star1 PIVOT (
SUM(sales) FOR qtr
IN ('Q1',
'Q2',
'Q3')
)Tmp;
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 |
--------+-------+------+------+------+------+------+
Snowflake¶
Consulta¶
SELECT
*
FROM
star1 PIVOT(
SUM(sales) FOR qtr IN ('Q1',
'Q2',
'Q3'))Tmp;
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 |
--------+-------+------+------+------+------+------+
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;
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 |
--------+-------+------+------+--------------+--------------+--------------+
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;
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 |
--------+-------+------+------+--------------+--------------+--------------+
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¶
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 ] [,...] )
Sintaxe do Snowflake¶
RANK() OVER
(
[ PARTITION BY <expr1> ]
ORDER BY <expr2> [ { ASC | DESC } ]
[ <window_frame> ]
)
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);
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);
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;
Resultado¶
| SALES | SALESASC | SALESDESC | SALESDEFAULT |
|---|---|---|---|
| NULL | 6 | 6 | 6 |
| 200 | 5 | 1 | 1 |
| 150 | 3 | 2 | 2 |
| 150 | 3 | 2 | 2 |
| 120 | 2 | 4 | 4 |
| 100 | 1 | 5 | 5 |
Snowflake¶
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;
Resultado¶
| SALES | SALESASC | SALESDESC | SALESDEFAULT |
|---|---|---|---|
| NULL | 6 | 6 | 6 |
| 200 | 5 | 1 | 1 |
| 150 | 3 | 2 | 2 |
| 150 | 3 | 2 | 2 |
| 120 | 2 | 4 | 4 |
| 100 | 1 | 5 | 5 |
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)
Amostra de padrões da origem¶
Dados de configuração¶
Teradata¶
Consulta
CREATE TABLE regexpTable
(
col1 CHAR(35)
);
INSERT INTO regexpTable VALUES('hola');
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');
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;
Resultado
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala |null |1 |0 |
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;
Resultado
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala |null |1 |FALSE |
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¶
SSC-FDM-0007: elemento com dependências ausentes.
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 )
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');
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');
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;
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 |
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;
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 |
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])
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);
Resultado
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W |Hel |ello W |Hel |
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);
Resultado
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W |Hel |ello W |Hel |
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' } )
]
)
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);
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);
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;
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 |
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;
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 |
Problemas conhecidos¶
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.
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¶
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])
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');
Resultado
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
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 ***/;
Resultado
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
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''');
Resultado
COLUMN1 | COLUMN2 | COLUMN3 |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |
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 ***/;
Resultado
COLUMN1 | COLUMN2 | COLUMN3 |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |
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¶
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 } ]
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);
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);
Transformação de XMLAGG¶
Teradata¶
Consulta
select
xmlagg(o_orderkey order by o_totalprice desc) (varchar(10000))
from orders
where o_totalprice > 5;
Resultado
COLUMN1 |
--------+
4 3 1 2 |
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;
Resultado
COLUMN1 |
--------+
4 3 1 2 |
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))||'"';
Resultado
(('"'||12)||'"')|
----------------+
"12" |
Snowflake¶
Consulta
SELECT
'"'|| LEFT(TO_VARCHAR(cast(12 as BYTEINT), 'TM'), 10) ||'"';
Resultado
"'""'|| LEFT(TO_VARCHAR(CAST(12 AS BYTEINT), 'TM'), 10) ||'""'"
---------------------------------------------------------------
"12"
SMALLINT¶
Teradata¶
Consulta
SELECT '"'||cast(cast(123 as SMALLINT) as varchar(10))||'"';
Resultado
(('"'||123)||'"')|
-----------------+
"123" |
Snowflake¶
Consulta
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'"';
Resultado
"'""'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"123"
INTEGER¶
Teradata¶
Consulta
SELECT '"'||cast(cast(12345 as INTEGER) as varchar(10))||'"';
Resultado
(('"'||12345)||'"')|
-------------------+
"12345" |
Snowflake¶
Consulta
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'"';
Resultado
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'""'"
------------------------------------------------------------------
"12345"
BIGINT¶
Teradata¶
Consulta
SELECT '"'||cast(cast(12345 as BIGINT) as varchar(10))||'"';
Resultado
(('"'||12345)||'"')|
-------------------+
"12345" |
Snowflake¶
Consulta
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'"';
Resultado
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"12345"
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))||'"';
Resultado
(('"'||12345)||'"')|(('"'||12345)||'"')|
-------------------+-------------------+
"12345." |"12345.00" |
Snowflake¶
Consulta
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL), 'TM.'), 10) ||'"',
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL(12, 2)), 'TM'), 10) ||'"';
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;
Resultado
COLUMN1 |COLUMN2
-----------------+--------------+
"-.10" |".10" |
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;
Resultado
COLUMN1 |COLUMN2
------------------+---------------+
"-0.10" |"0.10" |
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'}
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'};
Snowflake
Conversão para data
SELECT
* FROM
PUBLIC.RESOURCE_DETAILS
where change_ts >= DATE('2022-09-10');
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;
Resultado
VARCHAR_TO_INTERVAL | NUMBER_TO_INTERVAL | OUTSIDE_DATETIME_OPERATION |
--------------------+--------------------+----------------------------+
2022-10-15 23:04:56 |2017-10-15 10:30:00 | 7:00 |
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;
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 |
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;
Resultado
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-11-04 20:30:00 | 20 10 |
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;
Resultado
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-11-04 20:30:00.000 | 20 10 |
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;
Resultado
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-10-19 13:30:00 | 4 03 |
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;
Resultado
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-10-19 13:30:00.000 | 4 03 |
Problemas conhecidos¶
Nenhum problema conhecido.
EWIs relacionados¶
Sem EWIs relacionados.