Compartilhar via


Função cast

Aplica-se a: marca de seleção positiva SQL do Databricks marca de seleção positiva Databricks Runtime

Converte o valor expr no tipo de dados de destino type. Esse operador é sinônimo de :: (sinal de dois pontos) operador

Sintaxe

cast(sourceExpr AS targetType)

Argumentos

  • sourceExpr: qualquer expressão que possa ser convertida.
  • targetType: o tipo de dados do resultado.

Retornos

O resultado é o tipo targetType.

As seguintes combinações de conversão de tipo de dados são válidas:

Origem (linha) Destino(coluna) VOID numeric STRING DATE TIMESTAMP TIMESTAMP_NTZ intervalo de ano-mês intervalo de dia-tempo BOOLIANO BINARY ARRAY MAP STRUCT VARIANT OBJECT
VOID S N N N N N N N N N N N N Y N
numeric N S Y N Y N S N Y N N N N Y N
STRING N S N N N N N N N Y N N N Y N
DATE N N S N N Y N N N N N N N Y N
TIMESTAMP N S N N N Y N N N N N N N Y N
TIMESTAMP_NTZ N N S N N Y N N N N N N N Y N
intervalo de ano-mês N S Y N N N Y N N N N N N N N
intervalo de dia-tempo N S Y N N N N Y N N N N N N N
BOOLIANO N S Y N Y N N N Y N N N N Y N
BINARY N S Y N N N N N N Y N N N Y N
ARRAY N N Y N N N N N N N Y N N Y N
MAP N N Y N N N N N N N N Y N N N
STRUCT N N Y N N N N N N N N N Y N N
VARIANT N S N N N Y N N S N N N N Y N
OBJECT N N N N N N N N N N N S Y N N

Regras e limitações com base em targetType

Aviso

No Databricks Runtime, se spark.sql.ansi.enabled for false, um estouro não causará um erro, mas "encapsulará" o resultado.

Um valor sourceExpr com um formato inválido ou caracteres inválidos para targetType resultará em um NULL.

numeric

Se o targetType for um numérico e sourceExpr for do tipo:

  • VOID

    O resultado é um NULL do tipo numérico especificado.

  • numeric

    Se targetType for um numérico integral, o resultado é sourceExpr truncado para um número inteiro.

    Caso contrário, o resultado será sourceExpr arredondado para uma escala de targetTypedisponível.

    Se o valor estiver fora do intervalo de targetType, um erro de estouro é gerado.

    Use try_cast para transformar erros de estouro em NULL.

  • STRING

    sourceExpr é lido como um valor literal do targetType.

    Se sourceExpr não estiver em conformidade com o formato para valores literais, um erro será gerado.

    Se o valor estiver fora do intervalo do targetType, um erro de estouro é gerado.

    Use try_cast para transformar erros de estouro e formato inválidos em NULL.

  • CARIMBO DE DATA/HORA

    O resultado é o número de segundos decorridos entre 1970-01-01 00:00:00 UTC e sourceExpr.

    Se targetType for um numérico integral, o resultado é truncado para um número inteiro.

    Caso contrário, o resultado será arredondado para um ajuste na escala disponível de targetType.

    Se o resultado estiver fora do intervalo de targetType, um erro de estouro é gerado.

    Use try_cast para transformar erros de estouro em NULL.

  • INTERVALO

    Aplica-se a: verificação marcada como sim SQL do Databricks verificação marcada como sim Databricks Runtime 11.3 LTS e versões posteriores

    O tipo de destino precisa ser um numérico exato.

    Dado um INTERVAL upper_unit TO lower_unit, o resultado é medido em número total de lower_unit. Se a lower_unit for SECOND, os segundos fracionários serão armazenados à direita do ponto decimal. Para todos os outros intervalos, o resultado é sempre um número integral.

  • BOOLIANO

    Se sourceExpr for:

    • true: o resultado é 1.
    • false: o resultado é 0.
    • NULL: o resultado é NULL.
  • VARIANT

    As regras do tipo do valor real do tipo VARIANT se aplicam.

Exemplos

> SELECT cast(NULL AS INT);
  NULL

> SELECT cast(5.6 AS INT);
  5

> SELECT cast(5.6 AS DECIMAL(2, 0));
  6

> SELECT cast(-5.6 AS INT);
  -5

> SELECT cast(-5.6 AS DECIMAL(2, 0));
  -6

> SELECT cast(128 AS TINYINT);
  Overflow

> SELECT cast(128 AS DECIMAL(2, 0));
  Overflow

> SELECT cast('123' AS INT);
  123

> SELECT cast('123.0' AS INT);
  Invalid format

> SELECT cast(TIMESTAMP'1970-01-01 00:00:01' AS LONG);
  1

> SELECT cast(TIMESTAMP'1970-01-01 00:00:00.000001' AS DOUBLE);
  1.0E-6

> SELECT cast(TIMESTAMP'2022-02-01 00:00:00' AS SMALLINT);
  error: overflow
> SELECT cast(true AS BOOLEAN);
  1

> SELECT cast(INTERVAL '1-2' YEAR TO MONTH AS INTEGER);
  14

> SELECT cast(INTERVAL '1:30.5' MINUTE TO SECOND AS DECIMAL(5, 2));
  90.50

> SELECT cast(TRUE AS INT);
  1

> SELECT cast(FALSE AS INT);
  0

> SELECT cast('15'::VARIANT AS INT);
  15

STRING

Se o targetType for um do tipo STRING e sourceExpr for do tipo:

  • VOID

    O resultado é uma cadeia de caracteres NULL.

  • numérico exato

    O resultado é o número literal com um sinal de menos opcional e nenhum zero à esquerda, exceto o dígito único à esquerda do ponto decimal. Se o targetType for DECIMAL(p, s) com s maior do que 0, um ponto decimal será adicionado e zeros serão adicionados à escala.

  • binário de ponto flutuante

    Se o número absoluto for menor do que 10,000,000 e maior ou igual a 0.001, o resultado é expresso sem notação científica com pelo menos um dígito em ambos os lados do ponto decimal.

    Caso contrário, o Azure Databricks usará uma mantissa seguida por E e um expoente. A mantissa tem um sinal de menos à esquerda opcional seguido por um dígito à esquerda do ponto decimal e o número mínimo de dígitos maior do que zero para a direita. O expoente tem um opcional sinal de menos à esquerda.

  • DATA

    Se o ano estiver entre 9999 a.C. e 9999 d.C, o resultado é uma dateString do formulário -YYYY-MM-DD e YYYY-MM-DD, respectivamente.

    Para anos anteriores ou após esse intervalo, o número necessário de dígitos é adicionado ao componente de ano e + é usado para d.C.

  • CARIMBO DE DATA/HORA

    Se o ano estiver entre 9999 a.C. e 9999 d.C, o resultado é uma timestampString do formulário -YYYY-MM-DD hh:mm:ss e YYYY-MM-DD hh:mm:ss, respectivamente.

    Para anos anteriores ou após esse intervalo, o número necessário de dígitos é adicionado ao componente de ano e + é usado para d.C.

    .f... de segundos fracionários são adicionados, se necessário.

  • TIMESTAMP_NTZ

    Se o ano estiver entre 9999 a.C. e 9999 d.C, o resultado é uma timestampString do formulário -YYYY-MM-DD hh:mm:ss e YYYY-MM-DD hh:mm:ss, respectivamente.

    Para anos anteriores ou após esse intervalo, o número necessário de dígitos é adicionado ao componente de ano e + é usado para d.C.

    .f... de segundos fracionários são adicionados, se necessário.

  • intervalo de ano-mês

    O resultado é sua representação mais curta do literal de intervalo. Se o intervalo for negativo, o sinal será inserido no interval-string. Para unidades menores que 10, os zeros à esquerda são omitidos.

    Uma cadeia de caracteres de intervalo típica de ano/mês tem o formulário:

    • INTERVAL 'Y' YEAR
    • INTERVAL 'Y-M' YEAR TO MONTH
    • INTERVAL 'M' MONTH
  • intervalo de dia-tempo

    O resultado é sua representação mais curta do literal de intervalo. Se o intervalo for negativo, o sinal será inserido no interval-string. Para unidades menores que 10, os zeros à esquerda são omitidos.

    Uma cadeia de caracteres típica de intervalo de dia/horário tem o formulário:

    • INTERVAL 'D' DAY
    • INTERVAL 'D h' DAY TO HOUR
    • INTERVAL 'D h:m' DAY TO MINUTE
    • INTERVAL 'D h:m:s' DAY TO SECOND
    • INTERVAL 'h' HOUR
    • INTERVAL 'h:m' HOUR TO MINUTE
    • INTERVAL 'm:s' MINUTE TO SECOND
    • INTERVAL 's' SECOND
  • BOOLEAN

    O resultado do booliano true é o literal de STRING true. Para false é o literal de cadeia de caracteres false. Para NULL é a cadeia de caracteres NULL.

  • BINARY

    Um resultado é o sourceExpr binário interpretado como uma sequência de caracteres UTF-8.

    O Azure Databricks não valida os caracteres UTF-8. Uma conversão de BINARY para STRING nunca injetará caracteres de substituição ou gerará um erro.

  • MATRIZ

    O resultado é uma lista separada por vírgulas de elementos de conversão, que é preparada com colchetes [ ]. Um espaço segue cada vírgula. Um elemento NULL é movido para um null literal.

    O Azure Databricks não cita ou marca elementos individuais, que podem conter colchetes ou vírgulas.

  • MAPA

    O resultado é uma lista separada por vírgulas de pares de valor de chave de conversão, que é colocada entre chaves { }. Um espaço segue cada vírgula. Cada par chave/valor é separado por um ->. Um valor de mapa NULL é movido para null literal.

    O Azure Databricks não cita ou marca valores ou chaves individuais, que podem conter chaves, vírgulas ou ->.

  • STRUCT

    O resultado é uma lista separada por vírgulas de valores de campo de conversão, que é colocada entre chaves { }. Um espaço segue cada vírgula. Um valor de campo NULL é movido para um literal null.

    O Azure Databricks não cita ou marca valores de campo individuais, que podem conter chaves ou vírgulas.

  • VARIANT

    As regras do tipo do valor real do tipo VARIANT se aplicam.

Exemplos

> SELECT cast(NULL AS STRING);
  NULL

> SELECT cast(-3Y AS STRING);
  -3

> SELECT cast(5::DECIMAL(10, 5) AS STRING);
  5.00000

> SELECT cast(12345678e-4 AS STRING);
  1234.5678

> SELECT cast(1e7 as string);
  1.0E7

> SELECT cast(1e6 as string);
  1000000.0

> SELECT cast(1e-4 as string);
  1.0E-4

> SELECT cast(1e-3 as string);
  0.001

> SELECT cast(12345678e7 AS STRING);
  1.2345678E14

> SELECT cast(DATE'1900-12-31' AS STRING);
  1900-12-31

-- Caesar no more
> SELECT cast(DATE'-0044-03-15' AS STRING);
  -0044-03-15

> SELECT cast(DATE'100000-12-31' AS STRING);
  +100000-12-31

> SELECT cast(current_timestamp() AS STRING);
  2022-04-02 22:29:09.783

> SELECT cast(TIMESTAMP_NTZ'2023-01-01' AS STRING);
  2023-01-01 00:00:00

> SELECT cast(INTERVAL -'13-02' YEAR TO MONTH AS STRING);
  INTERVAL '-13-2' YEAR TO MONTH

> SELECT cast(INTERVAL '12:04.9900' MINUTE TO SECOND AS STRING);
  INTERVAL '12:04.99' MINUTE TO SECOND

> SELECT cast(true AS STRING);
  true

> SELECT cast(false AS STRING);
  false

-- A bad UTF-8 string
> SELECT cast(x'33800033' AS STRING);
  3�3

> SELECT hex(cast(x'33800033' AS STRING));
  33800033

> SELECT cast(array('hello', NULL, 'world') AS STRING);
  [hello, null, world]

> SELECT cast(array('hello', 'wor, ld') AS STRING);
  [hello, wor, ld]

> SELECT cast(array() AS STRING);
  []

> SELECT cast(map('hello', 1, 'world', null) AS STRING);
  {hello -> 1, world -> null}

> SELECT cast(map('hello -> 1', DATE'2022-01-01') AS STRING);
  {hello -> 1 -> 2022-01-01}

> SELECT cast(map() AS STRING);
  {}

> SELECT cast(named_struct('a', 5, 'b', 6, 'c', NULL) AS STRING);
  {5, 6, null}

> SELECT cast(named_struct() AS STRING);
  {}

> SELECT cast(DATE'2024-01-05'::VARIANT AS STRING);
  2024-01-05

DATE

Se targetType for um do tipo DATE e sourceExpr for do tipo:

  • VOID

    O resultado é uma NULL DATE.

  • STRING

    sourceExpr deve ser uma dateString válida.

    Se sourceExpr não for um dateString válido, o Azure Databricks retornará um erro.

    Use try_cast para transformar erros de dados inválidos em NULL.

  • CARIMBO DE DATA/HORA

    O resultado é a parte da data do carimbo de data/hora sourceExpr.

  • TIMESTAMP_NTZ

    O resultado é a parte da data do carimbo de timestamp_ntz sourceExpr.

  • VARIANT

    As regras de tipo para o valor real mantido pelo tipo de dados VARIANT se aplicam.

Exemplos

> SELECT cast(NULL AS DATE);
  NULL

> SELECT cast('1900-10-01' AS DATE);
  1900-10-01

> SELECT cast('1900-10-01' AS DATE);
  1900-10-01

-- There is no February 30.
> SELECT cast('1900-02-30' AS DATE);
  Error

> SELECT cast(TIMESTAMP'1900-10-01 12:13:14' AS DATE);
  1900-10-01

> SELECT cast(TIMESTAMP_NTZ'1900-10-01 12:13:14' AS DATE);
  1900-10-01

> SELECT cast(TIMESTAMP_NTZ'1900-10-01 12:13:14'::VARIANT AS DATE);
  1900-10-01

timestamp

Se o targetType for um do tipo TIMESTAMP e sourceExpr for do tipo:

  • VOID

    O resultado é uma NULL DATE.

  • numeric

    sourceExpr será lido como o número de segundos desde 1970-01-01 00:00:00 UTC.

    Frações menores que microssegundos são truncadas.

    Se o valor estiver fora do intervalo de TIMESTAMP, um erro de estouro é gerado.

    Use try_cast para transformar erros de estouro em NULL.

  • STRING

    sourceExpr deve ser um carimbo de data/hora válido.

    Se sourceExpr não for um timestampString válido, o Azure Databricks retornará um erro.

    Use try_cast para transformar erros de dados inválidos em NULL.

  • DATE

    O resultado é a sourceExpr DATE às 00:00:00.

  • TIMESTAMP_NTZ

O resultado é um valor de carimbo de data/hora com os mesmos campos ano/mês/dia/hora/minuto/segundo de timestamp_ntz sourceExpr.

  • VARIANT

    As regras de tipo para o valor real mantido pelo tipo de dados VARIANT se aplicam.

Exemplos

> SELECT cast(NULL AS TIMESTAMP);
  NULL

> SET TIME ZONE '+00:00';
> SELECT cast(0.0 AS TIMESTAMP);
  1970-01-01 00:00:00

> SELECT cast(0.0000009 AS TIMESTAMP);
  1970-01-01 00:00:00

> SELECT cast(1e20 AS TIMESTAMP);
  Error: overflow

> SELECT cast('1900' AS TIMESTAMP);
  1900-01-01 00:00:00

> SELECT cast('1900-10-01 12:13:14' AS TIMESTAMP);
  1900-10-01 12:13:14

> SELECT cast('1900-02-30 12:13:14' AS TIMESTAMP);
  Error

> SELECT cast(DATE'1900-10-01' AS TIMESTAMP);
  1900-10-01 00:00:00

> SELECT cast(TIMESTAMP_NTZ'2023-01-01 02:03:04.567' as TIMESTAMP)
  2023-01-01 02:03:04.567

> SELECT cast(DATE'1900-10-01'::VARIANT AS TIMESTAMP);
  1900-10-01 00:00:00

TIMESTAMP_NTZ

Se o targetType for um do tipo TIMESTAMP_NTZ e sourceExpr for do tipo:

  • VOID

    O resultado é uma NULL DATE.

  • STRING

    sourceExpr deve ser um carimbo de data/hora válido.

    Se sourceExpr não for um timestampString válido, o Azure Databricks retornará um erro.

    Use try_cast para transformar erros de dados inválidos em NULL.

  • DATA

    O resultado é o DATE sourceExpr em 00:00:00h.

  • CARIMBO DE DATA/HORA

    O resultado é hora local como o sourceExpr no fuso horário da sessão.

  • VARIANT

    As regras de tipo para o valor real mantido pelo tipo de dados VARIANT se aplicam.

Exemplos

> SELECT cast(NULL AS TIMESTAMP_NTZ);
  NULL

> SELECT cast('1900' AS TIMESTAMP_NTZ);
  1900-01-01 00:00:00

> SELECT cast('1900-10-01 12:13:14' AS TIMESTAMP_NTZ);
  1900-10-01 12:13:14

> SELECT cast('1900-02-30 12:13:14' AS TIMESTAMP_NTZ);
  Error

> SELECT cast(DATE'1900-10-01' AS TIMESTAMP_NTZ);
  1900-10-01 00:00:00

> SELECT current_timezone(), CAST(TIMESTAMP'2021-7-1T8:43:28' as TIMESTAMP_NTZ);
  America/Los_Angeles 2021-07-01 08:43:28

> SELECT current_timezone(), CAST(TIMESTAMP'2021-7-1T8:43:28UTC+3' as TIMESTAMP_NTZ);
  America/Los_Angeles 2021-06-30 22:43:28

> SELECT cast(DATE'1900-10-01'::VARIANT AS TIMESTAMP_NTZ);
  1900-10-01 00:00:00

intervalo de ano/mês

Se o targetType for um intervalo de um ano/mês e sourceExpr for do tipo:

  • VOID

    O resultado é um intervalo de ano-mês NULL.

  • integral_numeric

    Aplica-se a: verificação marcada como sim SQL do Databricks verificação marcada como sim Databricks Runtime 11.3 LTS e versões posteriores

    O numérico é interpretado como um número de unidades inferiores do targetTypeyearmonthIntervalQualifier.

  • STRING

    sourceExpr deve ser um yearMonthIntervalString válido.

    Se sourceExpr não for um yearMonthIntervalString válido, o Azure Databricks retornará um erro.

    Use try_cast para transformar erros de dados inválidos em NULL.

  • intervalo de ano-mês

    Se o targetTypeyearMonthIntervalQualifier incluir MONTH o valor permanecerá inalterado, mas será reinterpretado para corresponder ao tipo de destino.

    Caso contrário, se o tipo de origem yearMonthIntervalQualifier incluir MONTH, o resultado é truncado para anos completos.

Exemplos

> SELECT cast(NULL AS INTERVAL YEAR);
  NULL

> SELECT cast('1-4' AS INTERVAL YEAR TO MONTH)::STRING;
  INTERVAL '1-4' YEAR TO MONTH

> SELECT cast('1' AS INTERVAL YEAR TO MONTH);
  error

> SELECT cast(INTERVAL '1-4' YEAR TO MONTH AS INTERVAL MONTH)::STRING;
  INTERVAL '16' MONTH

> SELECT cast(14 AS INTERVAL YEAR TO MONTH)::STRING;
  INTERVAL '1-2' YEAR TO MONTH

> SELECT cast(INTERVAL '1-11' YEAR TO MONTH AS INTERVAL YEAR)::STRING;
  INTERVAL '1' YEAR

intervalo de dia-horário

Se o targetType for um intervalo de dia-horário e sourceExpr for do tipo:

  • VOID

    O resultado é um intervalo de dia-hora NULL.

  • exact_numeric

    Aplica-se a: verificação marcada como sim SQL do Databricks verificação marcada como sim Databricks Runtime 11.3 LTS e versões posteriores

    O numérico é interpretado como um número de unidades inferiores do targetTypedayTimeIntervalQualifier. Se a unidade for SECOND, qualquer fração será interpretada como segundos fracionários.

  • STRING

    sourceExpr deve ser um dayTimeIntervalString válido.

    Se sourceExpr não for um dayTimeIntervalString válido, o Azure Databricks retornará um erro.

    Use try_cast para transformar erros de dados inválidos em NULL.

  • intervalo de dia-tempo

    Se o targetTypedayTimeIntervalQualifier incluir a menor unidade do tipo de origem dayTimeIntervalQualifier, o valor permanecerá inalterado, mas será reinterpretado para corresponder ao tipo de destino.

    Caso contrário, o intervalo sourceExpr será truncado para se ajustar ao targetType.

> SELECT cast(NULL AS INTERVAL HOUR);
  NULL

> SELECT cast('1 4:23' AS INTERVAL DAY TO MINUTE)::STRING;
  INTERVAL '1 04:23' DAY TO MINUTE

> SELECT cast('1' AS INTERVAL DAY TO MINUTE);
  error

> SELECT cast(INTERVAL '1 4:23' DAY TO MINUTE AS INTERVAL MINUTE)::STRING;
  INTERVAL '1703' MINUTE

> SELECT cast(INTERVAL '1 4:23' DAY TO MINUTE AS INTERVAL HOUR)::STRING;
  INTERVAL '28' HOUR

> SELECT cast(125.3 AS INTERVAL MINUTE TO SECOND)::STRING;
  INTERVAL '2:5.3' MINUTE TO SECOND

BOOLEAN

Se o targetType for um BOOLEAN e sourceExpr for do tipo:

  • VOID

    O resultado é um NULL de tipo BOOLEAN.

  • numeric

    Se sourceExpr for:

    • 0: o resultado é false.

      Caso contrário, o resultado será true.

  • STRING

    Se sourcEexpr (não diferenciará maiúsculas e minúsculas):

    • 'T', 'TRUE', 'Y', 'YES', or '1': o resultado é true
    • 'F', 'FALSE', 'N', 'NO', or '0': o resultado é false
    • NULL: o resultado é NULL

    Caso contrário, o Azure Databricks retornará uma sintaxe de entrada inválida para o tipo de erro booleano.

    Use try_cast para transformar erros de dados inválidos em NULL.

  • VARIANT

    As regras do tipo do valor real do tipo VARIANT se aplicam.

Exemplos

> SELECT cast(NULL AS BOOLEAN);
  NULL

> SELECT cast('T' AS BOOLEAN);
  true

> SELECT cast('True' AS BOOLEAN);
  true

> SELECT cast('1' AS BOOLEAN);
  true

> SELECT cast('0' AS BOOLEAN);
  false

> SELECT cast('n' AS BOOLEAN);
  false

> SELECT cast('on' AS BOOLEAN);
  error: invalid input syntax for type boolean

> SELECT cast(0 AS BOOLEAN);
  false

> SELECT cast(0.0E10 AS BOOLEAN);
  false

> SELECT cast(1 AS BOOLEAN);
  true

> SELECT cast(0.1 AS BOOLEAN);
  true

> SELECT cast('NaN'::FLOAT AS BOOLEAN);
  true

> SELECT cast(1::VARIANT AS BOOLEAN);
  true

BINARY

Se o targetType for um BINARY e sourceExpr for do tipo:

  • VOID

    O resultado é um NULL de tipo BINARY.

  • STRING

    O resultado é a codificação UTF-8 do surceExpr.

  • VARIANT

    As regras de tipo para o valor real mantido pelo tipo de dados VARIANT se aplicam.

Exemplos

> SELECT cast(NULL AS BINARY);
  NULL

> SELECT hex(cast('Spark SQL' AS BINARY));
  537061726B2053514C

> SELECT hex(cast('Oдesa' AS BINARY));
  4FD0B4657361

> SELECT hex(cast('Oдesa'::VARIANT AS BINARY));
  4FD0B4657361

ARRAY

Se o targetType for um ARRAY < targetElementType > e sourceExpr for do tipo:

  • VOID

    O resultado é um NULL do targeType.

  • ARRAY < sourceElementType >

    Se houver suporte para a conversão de sourceElementType para targetElementType, o resultado é um ARRAY<targetElementType> com todos os elementos convertidos para o targetElementType.

    O Azure Databricks gera um erro quando a conversão não tem suporte ou nenhum dos elementos pode ser convertido.

    Use try_cast para transformar erros de estouro ou dados inválidos em NULL.

  • VARIANT

    As regras de tipo para o valor real mantido pelo tipo de dados VARIANT se aplicam.

Exemplos

> SELECT cast(NULL AS ARRAY<INT>);
  NULL

> SELECT cast(array('t', 'f', NULL) AS ARRAY<BOOLEAN>);
  [true, false, NULL]

> SELECT cast(array('t', 'f', NULL) AS INTERVAL YEAR);
  error: cannot cast array<string> to interval year

> SELECT cast(array('t', 'f', 'o') AS ARRAY<BOOLEAN>);
  error: invalid input syntax for type boolean: o.

> SELECT cast(array('t', 'f', NULL)::VARIANT AS ARRAY<BOOLEAN>);
  [true, false, NULL]

MAP

Se o targetType for um MAP < targetKeyType, targetValueType > e sourceExpr for do tipo:

  • VOID

    O resultado é um NULL do targetType.

  • MAP <sourceKeyType, sourceValueType >

    Se houver suporte para as conversões de sourceKeyType para targetKeyType e sourceValueType para targetValueType, o resultado é um MAP<targetKeyType, targetValueType> com todas as chaves convertidas para o targetKeyType e todos os valores convertidos para o targetValueType.

    O Azure Databricks gera um erro quando a conversão não tem suporte ou nenhum dos valores ou chaves pode ser convertido.

    Use try_cast para transformar erros de estouro ou dados inválidos em NULL.

  • VARIANT

    As regras de tipo para o valor real mantido pelo tipo de dados VARIANT se aplicam.

  • OBJECT < [sourceFieldName : sourceFieldType [, …]] >

    Cada sourceFieldName do tipo STRING é convertido em targetKeyType e mapeado para uma chave de mapa. Cada valor de campo de origem de sourceFieldType é convertido em targetValueType e mapeado para o respectivo valor de mapa.

    O Azure Databricks irá gerar um erro se nenhuma conversão tiver suporte ou se nenhum dos valores de campo ou de chave puder ser convertido.

    Use try_cast para transformar erros de estouro ou dados inválidos em NULL.

Exemplos

> SELECT cast(NULL AS MAP<STRING, INT>);
  NULL

> SELECT cast(map('10', 't', '15', 'f', '20', NULL) AS MAP<INT, BOOLEAN>);
  {10 -> true, 15 -> false, 20 -> null}

> SELECT cast(map('10', 't', '15', 'f', '20', NULL) AS MAP<INT, ARRAY<INT>>);
  error: cannot cast map<string,string> to map<int,array<int>>

> SELECT cast(map('10', 't', '15', 'f', '20', 'o') AS MAP<INT, BOOLEAN>);
  error: invalid input syntax for type boolean: o.

-- Casting an OBJECT to a MAP
> SELECT schema_of_variant(parse_json('{"cars": 12, "bicycles": 5 }'));
  OBJECT<bicycles: BIGINT, cars: BIGINT>
> SELECT CAST(parse_json('{"cars": 12, "bicycles": 5 }') AS MAP<STRING, INTEGER>);
  {bicycles -> 5, cars -> 12}

STRUCT

Se o targetType for um STRUCT <[targetFieldName : targetFieldType [NOT NULL] [COMMENT str] [, …]] > e sourceExpr for do tipo:

  • VOID

    O resultado é um NULL do targetType.

  • STRUCT < [sourceFieldName : sourceFieldType [NOT NULL] [COMMENT str] [, …]] >

    A sourceExpr pode ser convertida em targetType se todas essas condições forem verdadeiras:

    • O tipo de origem tem o mesmo número de campos que o destino
    • Para todos os campos: sourceFieldTypeN pode ser convertido para o targetFieldTypeN.
    • Para todos os valores de campo: o valor do campo de origem N pode ser convertido para targetFieldTypeN e o valor não será nulo se o campo de destino N for marcado como NOT NULL.

    sourceFieldNames, restrições NOT NULL de origem e COMMENTs de origem não precisam corresponder ao targetType e são ignorados.

    O Azure Databricks gera um erro quando a conversão não tem suporte ou nenhum dos elementos pode ser convertido.

    Use try_cast para transformar erros de estouro ou dados inválidos em NULL.

  • VARIANT

    As regras de tipo para o valor real mantido pelo tipo de dados VARIANT se aplicam.

  • OBJECT < [sourceFieldName : sourceFieldType [, …]] >

    Todos os sourceFieldNames são equiparados a sourceFieldNames. Cada valor de campo de origem sourceFieldType é convertido no valor equiparado targetValueType e mapeado para o respectivo valor de mapa.

    Se um targetFieldName não for equiparado, o valor do campo será NULL.

    Se um sourceFieldName não for equiparado, o campo será ignorado.

    O Azure Databricks irá gerar um erro se nenhuma conversão tiver suporte ou se nenhum dos valores de campo ou de chave puder ser convertido.

    Use try_cast para transformar erros de estouro ou dados inválidos em NULL.

Exemplos

> SELECT cast(NULL AS STRUCT<a:INT>);
  NULL

> SELECT cast(named_struct('a', 't', 'b', '1900-01-01') AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
  {"b":true,"c":1900-01-01}

> SELECT cast(named_struct('a', 't', 'b', NULL::DATE) AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
  error: cannot cast struct<a:string,b:date> to struct<b:boolean,c:date>

> SELECT cast(named_struct('a', 't', 'b', '1900') AS STRUCT<b:BOOLEAN, c:ARRAY<INT>>);
  error: cannot cast struct<a:string,b:string> to struct<b:boolean,c:array<int>>

> SELECT cast(named_struct('a', 't', 'b', 'hello') AS STRUCT<b:BOOLEAN, c:DATE>);
  error: Cannot cast hello to DateType

> SELECT cast(named_struct('a', 't', 'b', '1900-01-01')::VARIANT AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
  {"b":true,"c":1900-01-01}

-- Casting an OBJECT to a STRUCT
> SELECT schema_of_variant(parse_json('{"name": "jason", "age": 25 }'));
  OBJECT<age: BIGINT, name: STRING>
> SELECT CAST(parse_json('{"name": "jason", "age": 25 }') AS STRUCT<id: BIGINT, name: STRING>);
  {"id":null,"name":"jason"}

VARIANT

Se o targetType for uma VARIANT e sourceExpr for do tipo:

  • VOID

    O resultado é um NULL de tipo VARIANT.

  • numeric

    O resultado será uma VARIANT representando o valor numérico. A precisão dos tipos DECIMAL deve ser <= 38.

    Todos os valores numéricos inteiros são mapeados para BIGINT.

    Todos os valores DECIMAL são mapeados para o menor número possível de algarismos e casas decimais para a precisão desejada.

  • STRING

    O resultado é uma VARIANT que representa o valor STRING.

  • DATE

    O resultado é uma VARIANT que representa o valor DATE.

  • TIMESTAMP

    O resultado é uma VARIANT que representa o valor TIMESTAMP.

  • TIMESTAMP_NTZ

    O resultado é uma VARIANT que representa o valor TIMESTAMP NTZ.

  • BOOLEAN

    O resultado é uma VARIANT que representa o valor BOOLEAN.

  • BINARY

    O resultado é uma VARIANT que representa o valor BINARY.

  • ARRAY < sourceElementType >

    Se houver suporte para a conversão de sourceElementType em VARIANT, o resultado será VARIANT, representando ARRAY<sourceElementType>.

    O Azure Databricks irá gerar um erro se a conversão não tiver suporte.

    Use try_cast para transformar erros de estouro ou dados inválidos em NULL.

Exemplos

> SELECT cast(NULL AS VARIANT);
  NULL

> SELECT cast(5.1000 AS VARIANT);
  5.1

> SELECT schema_of_variant(cast(5 AS VARIANT));
  BIGINT