SnowConvert: Funções integradas do Teradata¶
Nota
Esta página lista apenas as funções que já foram transformadas pelo SnowConvert. Se uma função da documentação do Teradata não estiver listada aqui, ela deverá ser considerada sem suporte.
Nota
Algumas funções do Teradata não têm um equivalente direto no Snowflake, portanto, são transformadas em um equivalente funcional UDF, que pode ser facilmente identificado pelo pós-fixo _UDF no nome da função. Para obter mais informações sobre os usos do UDFs pelo SnowConvert, consulte este repositório git.
Funções de agregação¶
Teradata |
Snowflake |
Observação |
---|---|---|
AVG |
AVG |
|
CORR |
CORR |
|
COUNT |
COUNT |
|
COVAR_POP |
COVAR_POP |
|
COVAR_SAMP |
COVAR_SAMP |
|
GROUPING |
GROUPING |
|
KURTOSIS |
KURTOSIS |
|
MAXIMUM MAX |
MAX |
|
MINIMUM MIN |
MIN |
|
PIVOT |
PIVOT |
Verifique PIVOT. |
REGR_AVGX |
REGR_AVGX |
|
REGR_AVGY |
REGR_AVGY |
|
REGR_COUNT |
REGR_COUNT |
|
REGR_INTERCEPT |
REGR_INTERCEPT |
|
REGR_R2 |
REGR_R2 |
|
REGR_SLOPE |
REGR_SLOPE |
|
REGR_SXX |
REGR_SXX |
|
REGR_SXY |
REGR_SXY |
|
REGR_SYY |
REGR_SYY |
|
SKEW |
SKEW |
|
STDDEV_POP |
STDDEV_POP |
|
STDDEV_SAMP |
STDDEV_SAMP |
|
SUM |
SUM |
|
UNPIVOT |
UNPIVOT |
<p>Unpivot com várias funções<br>não é compatível com o Snowflake</p> |
VAR_POP |
VAR_POP |
|
VAR_SAMP |
VAR_SAMP |
Consulte Funções agregadas
Operadores/Funções aritméticas, trigonométricas e hiperbólicas¶
Teradata |
Snowflake |
Observação |
---|---|---|
ABS |
ABS |
|
CEILING |
CEIL |
|
DEGREES |
DEGREES |
|
EXP |
EXP |
|
FLOOR |
FLOOR |
|
HYPERBOLIC ACOSH ASINH ATANH COSH SINH TANH |
HYPERBOLIC ACOSH ASINH ATANH COSH SINH TANH |
|
LOG |
LOG |
|
LN |
LN |
|
MOD |
MOD |
|
NULLIFZERO(param) |
CASE WHEN param=0 THEN null ELSE param END |
|
POWER |
POWER |
|
RANDOM |
RANDOM |
|
RADIANS |
RADIANS |
|
ROUND |
ROUND |
|
SIGN |
SIGN |
|
SQRT |
SQRT |
|
TRUNC |
TRUNC_UDF |
|
TRIGONOMETRIC ACOS ASIN ATAN ATAN2 COS SIN TAN |
TRIGONOMETRIC ACOS ASIN ATAN ATAN2 COS SIN TAN |
|
ZEROIFNULL |
ZEROIFNULL |
Consulte Operadores/Funções aritméticas, trigonométricas e hiperbólicas
Funções de atributo¶
Teradata |
Snowflake |
Observação |
---|---|---|
BIT_LENGTH |
BIT_LENGTH |
|
BYTE BYTES |
LENGTH |
|
CHAR CHARS CHARACTERS |
LEN |
|
CHAR_LENGTH CHARACTER_LENGTH |
LEN |
|
MCHARACTERS |
LENGTH |
|
OCTECT_LENGTH |
OCTECT_LENGTH |
Consulte Funções de atributo
Funções de manipulação de bit/byte¶
Teradata |
Snowflake |
Observação |
---|---|---|
BITAND |
BITAND |
|
BITNOT |
BITNOT |
|
BITOR |
BITOR |
|
BITXOR |
BITXOR |
|
GETBIT |
GETBIT |
Consulte Funções de bit/byte
Integradas (funções do sistema)¶
Teradata |
Snowflake |
Observação |
---|---|---|
ACCOUNT |
CURRENT_ACCOUNT |
|
CURRENT_DATE CURDATE |
CURRENT_DATE |
|
CURRENT_ROLE |
CURRENT_ROLE |
|
CURRENT_TIME |
CURRENT_TIME |
|
CURRENT_TIMESTAMP |
CURRENT_TIMESTAMP |
|
DATABASE |
CURRENT_DATABASE |
|
DATE |
CURRENT_DATE |
|
NOW |
CURRENT_TIMESTAMP |
|
PROFILE |
CURRENT_ROLE |
|
SESSION |
CURRENT_SESSION |
|
TIME |
CURRENT_TIME |
|
USER |
CURRENT_USER |
Consulte Funções integradas
Calendários de negócios¶
Teradata |
Snowflake |
Observação |
---|---|---|
DAYNUMBER_OF_MONTH(DatetimeValue, “COMPATIBLE”) |
DAYOFMONTH |
|
DAYNUMBER_OF_MONTH(DatetimeValue, “ISO”) |
DAYNUMBER_OF_MONTH_ISO_UDF |
|
DAYNUMBER_OF_MONTH(DatetimeValue, “TERADATA”) |
DAYOFMONTH |
|
DAYNUMBER_OF_WEEK(DatetimeValue, “ISO”) |
DAYOFWEEKISO |
|
DAYNUMBER_OF_WEEK(DatetimeValue, “COMPATIBLE”) |
DAY_OF_WEEK_COMPATIBLE_UDF |
|
DAYNUMBER_OF_WEEK(DatetimeValue, “TERADATA”) |
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 integradas ao sistema pelo Teradata, mas que são transformadas pelo SnowConvert
Teradata |
Snowflake |
Observação |
---|---|---|
CHKNUM |
CHKNUM_UDF |
Consulte esta página de download de UDF |
Notas¶
Diferenças de arquitetura entre o Teradata e o Snowflake¶
O Teradata tem uma arquitetura sem compartilhamento com Access Module Processors (AMP), em que cada AMP gerencia sua própria parcela de armazenamento em disco e é acessado por meio de hashing ao fazer consultas. Para aproveitar o paralelismo, as informações armazenadas devem ser distribuídas uniformemente entre AMPs e, para isso, o Teradata oferece um grupo de funções relacionadas a hash que podem ser usadas para determinar a qualidade dos índices primários reais.
Por outro lado, a arquitetura do Snowflake é diferente e gerencia a forma como os dados são armazenados por conta própria, o que significa que os usuários não precisam se preocupar em otimizar a distribuição dos dados.
Constantes de limite final (UNTIL_CHANGED e UNTIL_CLOSED)¶
Tanto UNTIL_CHANGED quanto UNTIL_CLOSED são constantes do Teradata que representam um limite final indefinido para períodos. Internamente, essas constantes são representadas como o valor máximo que um carimbo de data/hora pode ter, ou seja, “9999-12-31 23:59:59.999999”. Durante a migração da função PERIOD, o limite final é verificado, se presente, para determinar se é uma dessas constantes e para substituí-lo por varchar de valor “9999-12-31 23:59:59.999999”, caso seja, o Snowflake então converte o varchar em data ou carimbo de data/hora, dependendo do tipo do limite inicial ao chamar PERIOD____UDF.
Conversão implícita¶
Algumas funções de cadeia de caracteres do Teradata, como INDEX ou POSITION, aceitam tipos de dados diferentes e os convertem implicitamente em cadeia de caracteres, o que pode causar inconsistências nos resultados dessas funções entre o Teradata e o Snowflake. Por exemplo, o seguinte código do Teradata:
SELECT INDEX(35, '5');
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_VARCHAR
do 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_VARCHAR
será 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.
Conversão do tipo de dados Number para o tipo de dados Varchar¶
O Teradata, quando converte para varchar, usa formatos padrão para cada tipo de dado numérico, portanto, o Snowconvert adiciona formatos para manter a equivalência entre as plataformas.
Amostra de padrões da origem¶
BYTEINT¶
Teradata¶
SELECT '"'||cast(cast(12 as BYTEINT) as varchar(10))||'"';
(('"'||12)||'"')|
----------------+
"12" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(cast(12 as BYTEINT), 'TM'), 10) ||'"';
"'""'|| LEFT(TO_VARCHAR(CAST(12 AS BYTEINT), 'TM'), 10) ||'""'"
---------------------------------------------------------------
"12"
SMALLINT¶
Teradata¶
SELECT '"'||cast(cast(123 as SMALLINT) as varchar(10))||'"';
(('"'||123)||'"')|
-----------------+
"123" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'"';
"'""'|| LEFT(TO_VARCHAR(CAST(123 AS SMALLINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"123"
INTEGER¶
Teradata¶
SELECT '"'||cast(cast(12345 as INTEGER) as varchar(10))||'"';
(('"'||12345)||'"')|
-------------------+
"12345" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'"';
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS INTEGER), 'TM'), 10) ||'""'"
------------------------------------------------------------------
"12345"
BIGINT¶
Teradata¶
SELECT '"'||cast(cast(12345 as BIGINT) as varchar(10))||'"';
(('"'||12345)||'"')|
-------------------+
"12345" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'"';
"'""'|| LEFT(TO_VARCHAR(CAST(12345 AS BIGINT), 'TM'), 10) ||'""'"
-----------------------------------------------------------------
"12345"
DECIMAL[(n[,m])] ou NUMERIC[(n[,m])]¶
Teradata¶
SELECT '"'||cast(cast(12345 as DECIMAL) as varchar(10))||'"',
'"'||cast(cast(12345 as DECIMAL(12, 2)) as varchar(10))||'"';
(('"'||12345)||'"')|(('"'||12345)||'"')|
-------------------+-------------------+
"12345." |"12345.00" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL), 'TM.'), 10) ||'"',
'"'|| LEFT(TO_VARCHAR(CAST(12345 AS DECIMAL(12, 2)), 'TM'), 10) ||'"';
'"'|| 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¶
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;
COLUMN1 |COLUMN2
-----------------+--------------+
"-.10" |".10" |
Snowflake¶
SELECT
'"'|| LEFT(TO_VARCHAR(CAST(-0.1 AS DECIMAL(12, 2)), 'TM'), 10) ||'"' AS column1,
'"'|| LEFT(TO_VARCHAR(CAST(0.1 AS DECIMAL(12, 2)), 'TM'), 10) ||'"' AS column2;
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
SELECT * FROM RESOURCE_DETAILS where change_ts >= {d '2022-09-10'};
Snowflake
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 transformará as funções CAST no tipo de dados INTERVAL em um equivalente, dependendo do caso:
Quando o valor que está sendo convertido for do tipo Interval, será gerado um UDF para produzir o novo intervalo equivalente como uma cadeia de caracteres
Quando o valor for um literal, será gerada uma constante de intervalo Snowflake se a conversão for usada em uma operação de data e hora; caso contrário, será gerada uma cadeia de caracteres literal
Quando o valor for não-literal, será gerada uma conversão para cadeia de caracteres
Amostra de padrões da origem¶
Literais não-intervalados¶
Teradata¶
SELECT TIMESTAMP '2022-10-15 10:30:00' + CAST ('12:34:56.78' AS INTERVAL HOUR(2) TO SECOND(2)) AS VARCHAR_TO_INTERVAL,
TIMESTAMP '2022-10-15 10:30:00' + CAST(-5 AS INTERVAL YEAR(4)) AS NUMBER_TO_INTERVAL,
CAST('07:00' AS INTERVAL HOUR(2) TO MINUTE) AS OUTSIDE_DATETIME_OPERATION;
VARCHAR_TO_INTERVAL | NUMBER_TO_INTERVAL | OUTSIDE_DATETIME_OPERATION |
--------------------+--------------------+----------------------------+
2022-10-15 23:04:56 |2017-10-15 10:30:00 | 7:00 |
Snowflake¶
SELECT
TIMESTAMP '2022-10-15 10:30:00' + INTERVAL '12 HOUR, 34 MINUTE, 56 SECOND, 780000 MICROSECOND' AS VARCHAR_TO_INTERVAL,
TIMESTAMP '2022-10-15 10:30:00' + INTERVAL '-5 YEAR' AS NUMBER_TO_INTERVAL,
'07:00' AS OUTSIDE_DATETIME_OPERATION;
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 intervalados¶
Teradata¶
SELECT TIMESTAMP '2022-10-15 10:30:00' + CAST('20 ' || '10' AS INTERVAL DAY TO HOUR) AS DATETIME_OPERATION,
CAST('20 ' || '10' AS INTERVAL DAY TO HOUR) AS OUTSIDE_DATETIME_OPERATION;
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-11-04 20:30:00 | 20 10 |
Snowflake¶
SELECT
PUBLIC.DATETIMEINTERVALADD_UDF(TIMESTAMP '2022-10-15 10:30:00', CAST('20 ' || '10' AS VARCHAR(21)), 'DAY', '+') AS DATETIME_OPERATION,
CAST('20 ' || '10' AS VARCHAR(21)) AS OUTSIDE_DATETIME_OPERATION;
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-11-04 20:30:00.000 | 20 10 |
Conversão de intervalo para outro intervalo¶
Teradata¶
SELECT
TIMESTAMP '2022-10-15 10:30:00' + CAST(INTERVAL '5999' MINUTE AS INTERVAL DAY TO HOUR) AS DATETIME_OPERATION,
CAST(INTERVAL '5999' MINUTE AS INTERVAL DAY TO HOUR) AS OUTSIDE_DATETIME_OPERATION;
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
--------------------+----------------------------+
2022-10-19 13:30:00 | 4 03 |
Snowflake¶
SELECT
PUBLIC.DATETIMEINTERVALADD_UDF(
TIMESTAMP '2022-10-15 10:30:00', PUBLIC.INTERVALTOINTERVAL_UDF('5999', 'MINUTE', 'MINUTE', 'DAY', 'HOUR'), 'DAY', '+') AS DATETIME_OPERATION,
PUBLIC.INTERVALTOINTERVAL_UDF('5999', 'MINUTE', 'MINUTE', 'DAY', 'HOUR') AS OUTSIDE_DATETIME_OPERATION;
DATETIME_OPERATION | OUTSIDE_DATETIME_OPERATION |
------------------------+----------------------------+
2022-10-19 13:30:00.000 | 4 03 |
Problemas conhecidos¶
Nenhum problema conhecido.
EWIs relacionados¶
Sem EWIs relacionados.
COALESCE¶
Descrição¶
A função coalesce é usada para retornar o primeiro elemento não nulo em uma lista. Para obter mais informações, consulte COALESCE.
COALESCE(element_1, element_2 [, element_3, ..., element_n])
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 emstring
usando a funçãoto_varchar
, que leva em conta o formato dos números. No segundo caso, todos os carimbos de data/hora são convertidos em data usando to_date
; o Teradata ignora o formato dos carimbos de data/hora ao convertê-los, portanto, ele é removido durante a transformação.
Amostra de padrões da origem¶
Parâmetros numéricos misturados com cadeia de caracteres¶
Teradata¶
SELECT COALESCE(125, 'hello', cast(850 as format '-999'));
COLUMN1|
-------+
125 |
Snowflake¶
SELECT
COALESCE(TO_VARCHAR(125), 'hello', TO_VARCHAR(850, '9000'));
COLUMN1|
-------+
125 |
Carimbo de data/hora misturado com parâmetros de data¶
Teradata¶
SELECT COALESCE(cast(TIMESTAMP '2021-09-14 10:14:59' as format 'HH:MI:SSBDD-MM-YYYY'), current_date);
COLUMN1 |
-----------+
2021-09-14 |
Snowflake¶
SELECT
COALESCE(TO_DATE(TIMESTAMP '2021-09-14 10:14:59' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'HH:MI:SSBDD-MM-YYYY' NOT SUPPORTED. ***/!!!), CURRENT_DATE());
COLUMN1 |
-----------+
2021-09-14 |
Problemas conhecidos¶
Nenhum problema conhecido_._
EWIs relacionados¶
SSC-EWI-TD0025: Formato de saída não suportado.
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, pode nos enviar um e-mail para snowconvert-support@snowflake.com
Problemas conhecidos ¶
Não foram encontrados problemas.
EWIs Relacionados ¶
Sem EWIs relacionados.
DAYNUMBER_OF_MONTH¶
Descrição¶
Retorna o número de dias decorridos desde o início do mês até a data fornecida. Para obter mais informações, consulte DAYNUMBER_OF_MONTH.
DAYNUMBER_OF_MONTH(expression [, calendar_name])
Tanto o Teradata quanto o Snowflake tratam a função DAYNUMBER_OF_MONTH da mesma forma, exceto em um caso:
O calendário ISO: Um mês ISO tem 4 ou 5 semanas completas. Para obter mais informações, consulte Sobre a computação ISO.
Para garantir a equivalência funcional, uma função definida pelo usuário (UDF) é adicionada para o caso do calendário ISO.
Amostra de padrões da origem¶
Teradata¶
SELECT
DAYNUMBER_OF_MONTH (DATE'2022-12-22'),
DAYNUMBER_OF_MONTH (DATE'2022-12-22', NULL),
DAYNUMBER_OF_MONTH (DATE'2022-12-22', 'Teradata'),
DAYNUMBER_OF_MONTH (DATE'2022-12-22', 'COMPATIBLE');
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22 |22 |22 |22 |
Snowflake¶
SELECT
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22'),
DAYOFMONTH(DATE'2022-12-22');
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
22 |22 |22 |22 |
Calendário ISO¶
Teradata¶
SELECT DAYNUMBER_OF_MONTH (DATE'2022-12-22', 'ISO');
COLUMN1|
-------+
25 |
Snowflake¶
SELECT
PUBLIC.DAYNUMBER_OF_MONTH_UDF(DATE'2022-12-22');
COLUMN1|
-------+
25 |
Problemas conhecidos ¶
Não foram encontrados problemas.
EWIs Relacionados ¶
Sem EWIs relacionados.
FROM_BYTES¶
Descrição¶
A função FROM_BYTES codifica uma sequência de bits em uma sequência de caracteres que representam sua codificação. Para obter mais informações, consulte FROM_BYTES(codificação).
O Snowflake não tem suporte para a função FROM_BYTES. No entanto, algumas soluções alternativas podem ser feitas para as ocorrências mais comuns dessa função.
Amostra de padrões da origem¶
Teradata¶
SELECT
FROM_BYTES('5A1B'XB, 'base10'), --returns '23067'
FROM_BYTES('5A3F'XB, 'ASCII'), --returns 'Z\ESC '
FROM_BYTES('5A1B'XB, 'base16'); -- returns '5A1B'
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+---------+
23067 | Z\ESC | 5A1B |
Snowflake¶
SELECT
--returns '23067'
TO_NUMBER('5A1B', 'XXXX'),
--returns 'Z\ESC '
!!!RESOLVE EWI!!! /*** SSC-EWI-0031 - FROM_BYTES FUNCTION NOT SUPPORTED ***/!!!
FROM_BYTES(TO_BINARY('5A3F'), 'ASCII'),
TO_BINARY('5A1B', 'HEX'); -- returns '5A1B'
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¶
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¶
SET QUERY_BAND = 'hola=hello;adios=bye;' FOR SESSION;
Snowflake¶
ALTER SESSION SET QUERY_TAG = 'hola=hello;adios=bye;';
GetQueryBandValue com o parâmetro QueryBandIn¶
Teradata¶
SELECT
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'account') as Example1,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'account') as Example2,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 2, 'account') as Example3,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 3, 'account') as Example4,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'role') as Example5,
GETQUERYBANDVALUE('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'role') as Example6;
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200 | Mark200 | SaraDB | Peter3 | DbAdmin | |
+----------+----------+----------+----------+----------+----------+
Snowflake¶
SELECT
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'account') as Example1,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'account') as Example2,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 2, 'account') as Example3,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 3, 'account') as Example4,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 0, 'role') as Example5,
GETQUERYBANDVALUE_UDF('=T> user=Mark;account=Mark200; =S> user=Sara;account=SaraDB;role=DbAdmin =P> user=Peter;account=Peter3;', 1, 'role') as Example6;
+----------+----------+----------+----------+----------+----------+
| EXAMPLE1 | EXAMPLE2 | EXAMPLE3 | EXAMPLE4 | EXAMPLE5 | EXAMPLE6 |
+----------+----------+----------+----------+----------+----------+
| Mark200 | Mark200 | SaraDB | Peter3 | DbAdmin | |
+----------+----------+----------+----------+----------+----------+
GetQueryBandValue sem o parâmetro QueryBandIn¶
Teradata¶
SELECT
GETQUERYBANDVALUE(2, 'hola') as Example1,
GETQUERYBANDVALUE(2, 'adios') as Example2;
+----------+----------+
| EXAMPLE1 | EXAMPLE2 |
+----------+----------+
| hello | bye |
+----------+----------+
Snowflake¶
SELECT
GETQUERYBANDVALUE_UDF('hola') as Example1,
GETQUERYBANDVALUE_UDF('adios') as Example2;
+----------+----------+
| 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¶
SELECT JSON_CHECK('{"key": "value"}');
Script Snowflake¶
SELECT
IFNULL(CHECK_JSON('{"key": "value"}'), 'OK');
JSON_CHECK dentro de transformação CASE¶
Teradata¶
SELECT CASE WHEN JSON_CHECK('{}') = 'OK' then 'OKK' ELSE 'NOT OK' END;
Script Snowflake¶
SELECT
CASE
WHEN IFNULL(CHECK_JSON('{}'), 'OK') = 'OK'
THEN 'OKK' ELSE 'NOT OK'
END;
Problemas conhecidos ¶
Não foram encontrados problemas.
EWIs Relacionados ¶
Sem EWIs relacionados.
JSON_EXTRACT¶
Descrição¶
De acordo com a documentação do Teradata, essas funções usam a sintaxe de consultaJSONPath para solicitar informações sobre uma parte de uma instância JSON. A entidade desejada pode ser qualquer parte de uma instância JSON, como um par nome/valor, um objeto, uma matriz, um elemento de matriz ou um valor.
Para obter mais informações sobre o Teradata JSONExtractValue, JSONExtractLargeValue e JSONExtract, veja aqui.
JSON_expr.JSONExtractValue(JSONPath_expr)
JSON_expr.JSONExtractLargeValue(JSONPath_expr)
JSON_expr.JSONExtract(JSONPath_expr)
O JSON_EXTRACT_UDF é uma implementação do Snowflake da especificação JSONPath que usa uma versão modificada da implementação JavaScript original desenvolvida por Stefan Goessner.
Amostra de padrão de origem¶
Teradata¶
SELECT
Store.JSONExtract('$..author') as AllAuthors,
Store.JSONExtractValue('$..book[2].title') as ThirdBookTitle,
Store.JSONExtractLargeValue('$..book[2].price') as ThirdBookPrice
FROM BookStores;
Script Snowflake¶
SELECT
JSON_EXTRACT_UDF(Store, '$..author', FALSE) as AllAuthors,
JSON_EXTRACT_UDF(Store, '$..book[2].title', TRUE) as ThirdBookTitle,
JSON_EXTRACT_UDF(Store, '$..book[2].price', TRUE) as ThirdBookPrice
FROM
BookStores;
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¶
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, pois as colunas geradas substituem a segunda coluna. Por esse motivo, o Snowconvert presume que a coluna tem o tipo correto e a usa para a transformação.
Amostra de padrões da origem¶
Dados de configuração¶
Teradata¶
create table myJsonTable(
col1 integer,
col2 JSON(1000)
);
insert into myJsonTable values(1,
new json('{
"name": "Matt",
"age" : 30,
"songs" : [
{"name" : "Late night", "genre" : "Jazz"},
{"name" : "Wake up", "genre" : "Rock"},
{"name" : "Who am I", "genre" : "Rock"},
{"name" : "Raining", "genre" : "Blues"}
]
}'));
Snowflake¶
CREATE OR REPLACE TABLE myJsonTable (
col1 integer,
col2 VARIANT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO myJsonTable
VALUES (1, TO_JSON(PARSE_JSON('{
"name": "Matt",
"age" : 30,
"songs" : [
{"name" : "Late night", "genre" : "Jazz"},
{"name" : "Wake up", "genre" : "Rock"},
{"name" : "Who am I", "genre" : "Rock"},
{"name" : "Raining", "genre" : "Blues"}
]
}')));
Código do padrão 1¶
Teradata¶
SELECT * FROM
JSON_TABLE(ON (SELECT COL1, COL2 FROM myJsonTable WHERE col1 = 1)
USING rowexpr('$.songs[*]')
colexpr('[ {"jsonpath" : "$.name",
"type" : "CHAR(20)"},
{"jsonpath" : "$.genre",
"type" : "VARCHAR(20)"}]')) AS JT(ID, "Song name", Genre);
ID | Song name | Genre |
---+------------+-------+
1 | Late night | Jazz |
---+------------+-------+
1 | Wake up | Rock |
---+------------+-------+
1 | Who am I | Rock |
---+------------+-------+
1 | Raining | Blues |
Snowflake¶
SELECT
* FROM
(
SELECT
COL1 AS ID,
rowexpr.value:name :: CHAR(20) AS "Song name",
rowexpr.value:genre :: VARCHAR(20) AS Genre
FROM
myJsonTable,
TABLE(FLATTEN(INPUT => COL2:songs)) rowexpr
WHERE col1 = 1
) JT;
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 omitido pelo SnowConvert, pois o Snowflake funciona somente com UTF-8.
Amostra de padrões da origem¶
NEW JSON com dados de cadeia de caracteres¶
Teradata¶
SELECT NEW JSON ('{"name" : "cameron", "age" : 24}'),
NEW JSON ('{"name" : "cameron", "age" : 24}', LATIN);
COLUMN1 | COLUMN2 |
----------------------------+-----------------------------+
{"age":24,"name":"cameron"} | {"age":24,"name":"cameron"} |
Snowflake¶
SELECT
TO_JSON(PARSE_JSON('{"name" : "cameron", "age" : 24}')),
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'LATIN' NOT SUPPORTED ***/!!!
TO_JSON(PARSE_JSON('{"name" : "cameron", "age" : 24}'));
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 não oferece suporte à análise de dados binários para criar um valor JSON. O usuário será avisado quando o SnowConvert encontrar um NEW JSON com dados binários.
EWIs relacionados¶
SSC-EWI-TD0039: Formato de entrada não suportado.
NVP¶
Descrição¶
Extrai o valor do par chave-valor em que a chave corresponde à enésima ocorrência do nome especificado para pesquisa. Consulte NVP.
[TD_SYSFNLIB.] NVP (
in_string,
name_to_search
[, name_delimiters ]
[, value_delimiters ]
[, occurrence ]
)
Amostra de padrões da origem¶
Caso básico de NVP¶
Teradata¶
SELECT
NVP('entree=-orange chicken&entree+.honey salmon', 'entree', '&', '=- +.', 1),
NVP('Hello=bye|name=Lucas|Hello=world!', 'Hello', '|', '=', 2),
NVP('Player=Mario$Game&Tenis%Player/Susana$Game=Chess', 'Player', '% $', '= & /', 2);
COLUMN1 | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world! | Susana |
Snowflake¶
SELECT
PUBLIC.NVP_UDF('entree=-orange chicken&entree+.honey salmon', 'entree', '&', '=- +.', 1),
PUBLIC.NVP_UDF('Hello=bye|name=Lucas|Hello=world!', 'Hello', '|', '=', 2),
PUBLIC.NVP_UDF('Player=Mario$Game&Tenis%Player/Susana$Game=Chess', 'Player', '% $', '= & /', 2);
COLUMN1 | COLUMN2 | COLUMN3 |
---------------+---------+---------+
orange chicken | world! | Susana |
NVP com parâmetros opcionais ignorados¶
Teradata¶
SELECT
NVP('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color'),
NVP('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color', 2),
NVP('City=Los Angeles#Color=Green#Color=Blue#City=San Jose', 'City', '#', '=');
COLUMN1 | COLUMN2 | COLUMN3 |
--------+---------+-------------+
Green | Blue | Los Angeles |
Snowflake¶
SELECT
PUBLIC.NVP_UDF('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color', '&', '=', 1),
PUBLIC.NVP_UDF('City=Los Angeles&Color=Green&Color=Blue&City=San Jose', 'Color', '&', '=', 2),
PUBLIC.NVP_UDF('City=Los Angeles#Color=Green#Color=Blue#City=San Jose', 'City', '#', '=', 1);
COLUMN1 | COLUMN2 | COLUMN3 |
--------+---------+-------------+
Green | Blue | Los Angeles |
NVP com espaços nos delimitadores¶
Teradata¶
SELECT
NVP('store = whole foods&&store: ?Bristol farms','store', '&&', '\ =\ :\ ?', 2),
NVP('Hello = bye|name = Lucas|Hello = world!', 'Hello', '|', '\ =\ ', 2);
COLUMN1 | COLUMN2 |
--------------+---------+
Bristol farms | world! |
Snowflake¶
SELECT
PUBLIC.NVP_UDF('store = whole foods&&store: ?Bristol farms', 'store', '&&', '\\ =\\ :\\ ?', 2),
PUBLIC.NVP_UDF('Hello = bye|name = Lucas|Hello = world!', 'Hello', '|', '\\ =\\ ', 2);
COLUMN1 | COLUMN2 |
--------------+---------+
Bristol farms | world! |
NVP com delimitadores não literais¶
Teradata¶
SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
Snowflake¶
SELECT
PUBLIC.NVP_UDF('store = whole foods&&store: ?Bristol farms', 'store', '&&', valueDelimiter, 2) /*** SSC-FDM-TD0008 - WHEN NVP_UDF FOURTH PARAMETER IS NON-LITERAL AND IT CONTAINS A BACKSLASH, THAT BACKSLASH NEEDS TO BE ESCAPED ***/;
Problemas conhecidos¶
1. Delimitadores com espaços (\ ) precisam ter a barra invertida no Snowflake
No Teradata, os delimitadores que incluem espaço os especificam usando «\ « (consulte NVP com espaços nos delimitadores), conforme mostrado nos exemplos, no Teradata não é necessário escapar a barra invertida, no entanto, isso é necessário no Snowflake. O escape das barras invertidas no delimitador pode ser feito automaticamente pelo SnowConvert, mas somente se os valores do delimitador forem cadeias de caracteres literais; caso contrário, o usuário será avisado de que as barras invertidas não puderam ser escapadas e que isso pode causar resultados diferentes no Snowflake.
EWIs relacionados¶
SSC-FDM-TD0008: Os delimitadores não literais com espaços precisam que a barra invertida seja escapada no snowflake.
OVERLAPS¶
Descrição¶
De acordo com a documentação do Teradata, o operador OVERLAPS compara duas ou mais expressões de período. Se elas se sobrepuserem, ele retornará true.
Para obter mais informações sobre OVERLAPS do Teradata, veja aqui.
period_expression
OVERLAPS
period_expression
PERIOD_OVERLAPS_UDF é uma implementação do Snowflake do operador OVERLAPS no Teradata.
Amostra de padrão de origem¶
Teradata¶
SELECT
PERIOD(DATE '2009-01-01', DATE '2010-09-24')
OVERLAPS
PERIOD(DATE '2009-02-01', DATE '2009-06-24');
Script Snowflake¶
SELECT
PUBLIC.PERIOD_OVERLAPS_UDF(ARRAY_CONSTRUCT(PUBLIC.PERIOD_UDF(DATE '2009-01-01', DATE '2010-09-24') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!, PUBLIC.PERIOD_UDF(DATE '2009-02-01', DATE '2009-06-24') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!)) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!;
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 dado period; em vez disso, todos os períodos são tratados como varchar
P_INTERSECT¶
Descrição¶
De acordo com a documentação do Teradata, o operador P_INTERSECT compara duas ou mais expressões de período. Se elas se sobrepuserem, ele retornará a parte comum das expressões de período.
Para obter mais informações sobre o P_INTERSECT do Teradata, veja aqui.
period_expression
P_INTERSECT
period_expression
O PERIOD_INTERSECT_UDF é uma implementação do Snowflake do operador P_INTERSECT no Teradata.
Amostra de padrão de origem¶
Teradata¶
SELECT
PERIOD(DATE '2009-01-01', DATE '2010-09-24')
P_INTERSECT
PERIOD(DATE '2009-02-01', DATE '2009-06-24');
Script Snowflake¶
SELECT
PUBLIC.PERIOD_INTERSECT_UDF(ARRAY_CONSTRUCT(PUBLIC.PERIOD_UDF(DATE '2009-01-01', DATE '2010-09-24') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!, PUBLIC.PERIOD_UDF(DATE '2009-02-01', DATE '2009-06-24') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!)) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!;
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 dado period; em vez disso, todos os períodos são tratados como varchar
PIVOT¶
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Descrição¶
A função pivot é usada para transformar as linhas de uma tabela em colunas. Para obter mais informações, consulte a documentação doPIVOT do Teradata
PIVOT ( pivot_spec )
[ WITH with_spec [,...] ]
[AS] derived_table_name [ ( cname [,...] ) ]
pivot_spec := aggr_fn_spec [,...] FOR for_spec
aggr_fn_spec := aggr_fn ( cname ) [ [AS] pvt_aggr_alias ]
for_spec := { cname IN ( expr_spec_1 [,...] ) |
( cname [,...] ) IN ( expr_spec_2 [,...] ) |
cname IN ( subquery )
}
expr_spec_1 := expr [ [AS] expr_alias_name ]
expr_spec_2 := ( expr [,...] ) [ [AS] expr_alias_name ]
with_spec := aggr_fn ( { cname [,...] | * } ) [AS] aggr_alias
Amostra de padrões da origem¶
Dados de configuração¶
Teradata¶
CREATE TABLE star1(
country VARCHAR(20),
state VARCHAR(10),
yr INTEGER,
qtr VARCHAR(3),
sales INTEGER,
cogs INTEGER
);
insert into star1 values ('USA', 'CA', 2001, 'Q1', 30, 15);
insert into star1 values ('Canada', 'ON', 2001, 'Q2', 10, 0);
insert into star1 values ('Canada', 'BC', 2001, 'Q3', 10, 0);
insert into star1 values ('USA', 'NY', 2001, 'Q1', 45, 25);
insert into star1 values ('USA', 'CA', 2001, 'Q2', 50, 20);
Snowflake¶
CREATE OR REPLACE TABLE star1 (
country VARCHAR(20),
state VARCHAR(10),
yr INTEGER,
qtr VARCHAR(3),
sales INTEGER,
cogs INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO star1
VALUES ('USA', 'CA', 2001, 'Q1', 30, 15);
INSERT INTO star1
VALUES ('Canada', 'ON', 2001, 'Q2', 10, 0);
INSERT INTO star1
VALUES ('Canada', 'BC', 2001, 'Q3', 10, 0);
INSERT INTO star1
VALUES ('USA', 'NY', 2001, 'Q1', 45, 25);
INSERT INTO star1
VALUES ('USA', 'CA', 2001, 'Q2', 50, 20);
Transformação de PIVOT básica¶
Teradata¶
SELECT *
FROM star1 PIVOT (
SUM(sales) FOR qtr
IN ('Q1',
'Q2',
'Q3')
)Tmp;
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¶
SELECT
*
FROM
star1 PIVOT(
SUM(sales) FOR qtr IN ('Q1',
'Q2',
'Q3'))Tmp;
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¶
SELECT *
FROM star1 PIVOT (
SUM(sales) as ss1 FOR qtr
IN ('Q1' AS Quarter1,
'Q2' AS Quarter2,
'Q3' AS Quarter3)
)Tmp;
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¶
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;
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 está transformando a função PIVOT na função PIVOT do Snowflake, que só suporta a aplicação da função em uma única coluna.
3. Não há suporte para a dinamização com várias funções agregadas
A função PIVOT no Snowflake suporta apenas a aplicação de uma função agregada sobre os dados.
4. Não há suporte para subconsulta na cláusula IN
A cláusula IN da função Snowflake PIVOT não aceita subconsultas.
5. Os aliases são suportados somente se todos os elementos da cláusula IN o tiverem e a especificação da tabela estiver presente
Para que os nomes das colunas com aliases sejam equivalentes, o SnowConvert exige que todos os valores especificados na cláusula IN tenham um alias especificado e que a especificação da tabela esteja presente no código de entrada, o que é necessário para que o SnowConvert possa criar com êxito a lista de aliases para a tabela resultante.
EWIs relacionados¶
SSC-EWI-0015: Não há suporte para o formulário de instrução pivot/unpivot de entrada
RANK¶
Descrição¶
RANK classifica um conjunto de resultados e identifica a classificação numérica de cada linha no resultado. O único argumento para RANK é a coluna ou colunas de classificação, e a função retorna um número inteiro que representa a classificação de cada linha no resultado. (RANK no Teradata)
Sintaxe do Teradata¶
RANK ( sort_expression [ ASC | DESC ] [,...] )
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¶
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¶
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.
SELECT
Sales,
RANK(Sales ASC) AS SalesAsc,
RANK(Sales DESC) AS SalesDesc,
RANK(Sales) AS SalesDefault
FROM
Sales;
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¶
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;
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¶
CREATE TABLE regexpTable
(
col1 CHAR(35)
);
INSERT INTO regexpTable VALUES('hola');
Snowflake¶
CREATE OR REPLACE TABLE regexpTable
(
col1 CHAR(35)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO regexpTable
VALUES ('hola');
Exemplo de transformação Regex¶
Teradata¶
SELECT
REGEXP_REPLACE(col1,'.*(h(i|o))','ha', 1, 0, 'x'),
REGEXP_SUBSTR(COL1,'.*(h(i|o))', 2, 1, 'x'),
REGEXP_INSTR(COL1,'.*(h(i|o))',1, 1, 0, 'x'),
REGEXP_SIMILAR(COL1,'.*(h(i|o))', 'xl')
FROM regexpTable;
COLUMN1|COLUMN2|COLUMN3|COLUMN4|
-------+-------+-------+-------+
hala |null |1 |0 |
Snowflake¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "regexpTable" **
SELECT
REGEXP_REPLACE(col1, '.*(h(i|o))', 'ha', 1, 0),
REGEXP_SUBSTR(COL1, '.*(h(i|o))', 2, 1),
REGEXP_INSTR(COL1, '.*(h(i|o))', 1, 1, 0),
--** SSC-FDM-TD0016 - VALUE 'l' FOR PARAMETER 'match_arg' IS NOT SUPPORTED IN SNOWFLAKE **
REGEXP_LIKE(COL1, '.*(h(i|o))')
FROM
regexpTable;
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 encontrar uma expressão regular que não sejaPOSIX.
2. A opção “l” do Teradata «match_arg» não é compatível com o Snowflake
A opção “l” não tem contrapartida no Snowflake e o usuário será avisado se o SnowConvert as encontrar.
3. O tamanho fixo do tipo de dados CHAR pode causar um comportamento diferente
Algumas funções regex no Teradata tentarão corresponder a coluna inteira do tipo de dados CHAR em uma tabela, mesmo que alguns dos caracteres da coluna tenham ficado vazios devido à inserção de uma cadeia de caracteres menor. No Snowflake, isso não acontece porque o tipo de dados CHAR é de tamanho variável.
4. REGEXP_SPLIT_TO_TABLE não suportado
No momento, a função não é compatível com o Snowflake.
EWIs relacionados¶
SSC-FDM-0007: Elemento com dependências ausentes.
SSC-FDM-TD0016: O valor “l” para o parâmetro “match_arg” não é compatível com o Snowflake.
STRTOK_SPLIT_TO_TABLE¶
Descrição¶
Divide uma cadeia de caracteres em uma tabela usando os delimitadores fornecidos. Para obter mais informações, consulte STRTOK_SPLIT_TO_TABLE.
[TD_SYSFNLIB.] STRTOK_SPLIT_TO_TABLE ( inkey, instring, delimiters )
RETURNS ( outkey, tokennum, token )
Amostra de padrões da origem¶
Dados de configuração¶
Teradata¶
CREATE TABLE strtokTable
(
col1 INTEGER,
col2 VARCHAR(100)
);
INSERT INTO strtokTable VALUES(4, 'hello-world-split-me');
INSERT INTO strtokTable VALUES(1, 'string$split$by$dollars');
Snowflake¶
CREATE OR REPLACE TABLE strtokTable
(
col1 INTEGER,
col2 VARCHAR(100)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO strtokTable
VALUES (4, 'hello-world-split-me');
INSERT INTO strtokTable
VALUES (1, 'string$split$by$dollars');
Transformação de STRTOK_SPLIT_TO_TABLE¶
Teradata¶
SELECT outkey, tokennum, token FROM table(STRTOK_SPLIT_TO_TABLE(strtokTable.col1, strtokTable.col2, '-$')
RETURNS (outkey INTEGER, tokennum INTEGER, token VARCHAR(100))) AS testTable
ORDER BY outkey, tokennum;
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¶
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;
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¶
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);
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W |Hel |ello W |Hel |
Snowflake¶
SELECT
SUBSTR('Hello World!', 2, 6),
PUBLIC.SUBSTR_UDF('Hello World!', -2, 6),
SUBSTRING('Hello World!', 2, 6),
PUBLIC.SUBSTR_UDF('Hello World!', -2, 6);
COLUMN1 |COLUMN2 |COLUMN3 | COLUMN4 |
--------+--------+--------+---------+
ello W |Hel |ello W |Hel |
EWIs relacionados¶
Sem EWIs relacionados.
TD_UNPIVOT¶
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Descrição¶
TD_UNPIVOT
no Teradata pode desvincular várias colunas de uma vez, enquanto o Snowflake UNPIVOT
só pode desvincular uma única coluna. A funcionalidade unpivot é usada para transformar colunas da tabela especificada em linhas. Para obter mais informações, consulte TD_UNPIVOT.
[TD_SYSFNLIB.] TD_UNPIVOT (
ON { tableName | ( query_expression ) }
USING VALUE_COLUMNS ( 'value_columns_value' [,...] )
UNPIVOT_COLUMN ( 'unpivot_column_value' )
COLUMN_LIST ( 'column_list_value' [,...] )
[ COLUMN_ALIAS_LIST ( 'column_alias_list_value' [,...] )
INCLUDE_NULLS ( { 'No' | 'Yes' } )
]
)
A transformação a seguir é capaz de gerar uma consulta SQL no Snowflake que desdobra várias colunas ao mesmo tempo, da mesma forma que funciona no Teradata.
Amostra de padrões da origem¶
Título dos dados de configuração¶
Teradata¶
CREATE TABLE superunpivottest (
myKey INTEGER NOT NULL PRIMARY KEY,
firstSemesterIncome DECIMAL(10,2),
secondSemesterIncome DECIMAL(10,2),
firstSemesterExpenses DECIMAL(10,2),
secondSemesterExpenses DECIMAL(10,2)
);
INSERT INTO superUnpivottest VALUES (2020, 15440, 25430.57, 10322.15, 12355.36);
INSERT INTO superUnpivottest VALUES (2018, 18325.25, 25220.65, 15560.45, 15680.33);
INSERT INTO superUnpivottest VALUES (2019, 23855.75, 34220.22, 14582.55, 24122);
Snowflake¶
CREATE OR REPLACE TABLE superunpivottest (
myKey INTEGER NOT NULL PRIMARY KEY,
firstSemesterIncome DECIMAL(10,2),
secondSemesterIncome DECIMAL(10,2),
firstSemesterExpenses DECIMAL(10,2),
secondSemesterExpenses DECIMAL(10,2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO superUnpivottest
VALUES (2020, 15440, 25430.57, 10322.15, 12355.36);
INSERT INTO superUnpivottest
VALUES (2018, 18325.25, 25220.65, 15560.45, 15680.33);
INSERT INTO superUnpivottest
VALUES (2019, 23855.75, 34220.22, 14582.55, 24122);
Transformação de TD_UNPIVOT¶
Teradata¶
SELECT * FROM
TD_UNPIVOT(
ON superunpivottest
USING
VALUE_COLUMNS('Income', 'Expenses')
UNPIVOT_COLUMN('Semester')
COLUMN_LIST('firstSemesterIncome, firstSemesterExpenses', 'secondSemesterIncome, secondSemesterExpenses')
COLUMN_ALIAS_LIST('First', 'Second')
)X ORDER BY mykey, Semester;
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¶
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;
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 precisa do nome das colunas que estão sendo usadas na função TD_UNPIVOT; se o usuário não incluir a lista de colunas na expressão query_expression da função, mas fornecer o nome da tabela que está sendo desvinculada, ele tentará recuperar os nomes das colunas na definição da tabela. Se os nomes não puderem ser encontrados, o usuário será avisado de que a consulta resultante pode estar perdendo colunas no resultado.
EWIs relacionados¶
SSC-EWI-TD0061: A transformação TD_UNPIVOT requer informações de coluna que não puderam ser encontradas; colunas ausentes no resultado.
TO_CHAR¶
Descrição¶
A função TO_CHAR converte um valor DateTime ou numérico em uma cadeia de caracteres. Para obter mais informações, consulte TO_CHAR(Numeric) e TO_CHAR(DateTime).
-- Numeric version
[TD_SYSFNLIB.]TO_CHAR(numeric_expr [, format_arg [, nls_param]])
-- DateTime version
[TD_SYSFNLIB.]TO_CHAR(dateTime_expr [, format_arg])
Tanto o Snowflake quanto o Teradata têm sua própria versão da função TO_CHAR. No entanto, o Teradata oferece suporte a vários formatos que não são nativamente compatíveis com o Snowflake. Para dar suporte a esses elementos de formato, o SnowConvert usa as funções incorporadas do Snowflake e as funções personalizadas UDFs para gerar uma expressão de concatenação que produz a mesma cadeia de caracteres que a função original TO_CHAR no Teradata.
Amostra de padrões da origem¶
Transformação de TO_CHAR(DateTime)¶
Teradata¶
SELECT
TO_CHAR(date '2012-12-23'),
TO_CHAR(date '2012-12-23', 'DS'),
TO_CHAR(date '2012-12-23', 'DAY DD, MON YY');
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
Snowflake¶
SELECT
TO_CHAR(date '2012-12-23') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
TO_CHAR(date '2012-12-23', 'MM/DD/YYYY') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
PUBLIC.DAYNAME_LONG_UDF(date '2012-12-23', 'uppercase') || TO_CHAR(date '2012-12-23', ' DD, ') || PUBLIC.MONTH_SHORT_UDF(date '2012-12-23', 'uppercase') || TO_CHAR(date '2012-12-23', ' YY') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;
COLUMN1 | COLUMN2 | COLUMN3 |
-----------+------------+-------------------+
2012/12/23 | 12/23/2012 | SUNDAY 23, DEC 12 |
Transformação de TO_CHAR(Numeric)¶
Teradata¶
SELECT
TO_CHAR(1255.495),
TO_CHAR(1255.495, '9.9EEEE'),
TO_CHAR(1255.495, 'SC9999.9999', 'nls_iso_currency = ''EUR''');
COLUMN1 | COLUMN2 | COLUMN3 |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |
Snowflake¶
SELECT
TO_CHAR(1255.495) /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
TO_CHAR(1255.495, '9.0EEEE') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/,
PUBLIC.INSERT_CURRENCY_UDF(TO_CHAR(1255.495, 'S9999.0000'), 2, 'EUR') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;
COLUMN1 | COLUMN2 | COLUMN3 |
---------+---------+---------------+
1255.495 | 1.3E+03 | +EUR1255.4950 |
Problemas conhecidos¶
1. Formatos com comportamentos diferentes ou sem suporte
A Teradata oferece uma lista extensa de elementos de formato que podem apresentar um comportamento diferente no Snowflake após a transformação da função TO_CHAR. Para obter a lista de elementos com comportamentos diferentes ou sem suporte, consulte SSC-EWI-TD0029.
EWIs relacionados¶
SSC-FDM-TD0029: Os formatos suportados pelo Snowflake para TO_CHAR diferem do Teradata e podem falhar ou ter um comportamento diferente.
XMLAGG¶
Descrição¶
Construa um valor XML realizando uma agregação de várias linhas. Para obter mais informações, consulte XMLAGG.
XMLAGG (
XML_value_expr
[ ORDER BY order_by_spec [,...] ]
[ RETURNING { CONTENT | SEQUENCE } ]
)
order_by_spec := sort_key [ ASC | DESC ] [ NULLS { FIRST | LAST } ]
Amostra de padrões da origem¶
Dados de configuração¶
Teradata¶
create table orders (
o_orderkey int,
o_totalprice float);
insert into orders values (1,500000);
insert into orders values (2,100000);
insert into orders values (3,600000);
insert into orders values (4,700000);
Snowflake¶
CREATE OR REPLACE TABLE orders (
o_orderkey int,
o_totalprice float)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO orders
VALUES (1,500000);
INSERT INTO orders
VALUES (2,100000);
INSERT INTO orders
VALUES (3,600000);
INSERT INTO orders
VALUES (4,700000);
Transformação de XMLAGG¶
Teradata¶
select
xmlagg(o_orderkey order by o_totalprice desc) (varchar(10000))
from orders
where o_totalprice > 5;
COLUMN1 |
--------+
4 3 1 2 |
Snowflake¶
SELECT
LEFT(TO_VARCHAR(LISTAGG ( o_orderkey, ' ')
WITHIN GROUP(
order by o_totalprice DESC NULLS LAST)), 10000)
from
orders
where o_totalprice > 5;
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.