# CAST

CAST converte o valor de um tipo de dado para outro, e fornece tipo de dado para o parâmetro dinâmico (?) e para o valor NULL.

As expressões CAST são permitidas em qualquer lugar onde uma expressão é permitida.

#### Sintaxe

    CAST ( [ Expressão | NULL | ? ]
        AS TipoDado)

O tipo de dado para o qual a expressão está sendo convertida é o tipo de destino. O tipo de dado da expressão a partir da qual está sendo feita a conversão é o tipo de origem.

#### Conversões CAST entre tipos de dado SQL-92

A tabela a seguir mostra as conversões explícitas válidas entre tipos de origem e tipos de destino para os tipos de dado do SQL.

Tabela 1. Conversões explícitas entre tipos de origem e tipos de destino para os tipos de dado do SQL. Esta tabela mostra quais conversões explícitas entre tipos de dado são válidas. A primeira coluna da tabela lista o tipo de origem, enquanto a primeira linha lista os tipos de destino. "S" indica que a conversão da origem para o destino é válida.
Tipos | S M A L L I N T | I N T E G E R | B I G I N T | D E C I M A L | R E A L | D O U B L E | F L O A T | C H A R | V A R C H A R | L O N G V A R C H A R | C H A R F O R B I T D A T A | V A R C H A R F O R B I T D A T A | L O N G V A R C H A R F O R B I T D A T A | C L O B | B L O B | D A T E | T I M E | T I M E S T A M P
--- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---
SMALLINT | S | S | S | S | S | S | S | S | - | - | - | - | - | - | - | - | - | -
INTEGER | S | S | S | S | S | S | S | S | - | - | - | - | - | - | - | - | - | -
BIGINT | S | S | S | S | S | S | S | S | - | - | - | - | - | - | - | - | - | -
DECIMAL | S | S | S | S | S | S | S | S | - | - | - | - | - | - | - | - | - | -
REAL | S | S | S | S | S | S | S | - | - | - | - | - | - | - | - | - | - | -
DOUBLE | S | S | S | S | S | S | S | - | - | - | - | - | - | - | - | - | - | -
FLOAT | S | S | S | S | S | S | S | - | - | - | - | - | - | - | - | - | - | -
CHAR | S | S | S | S | - | - | - | S | S | S | - | - | - | S | - | S | S | S
VARCHAR | S | S | S | S | - | - | - | S | S | S | - | - | - | S | - | S | S | S
LONG VARCHAR | - | - | - | - | - | - | - | S | S | S | - | - | - | S | - | - | - | -
CHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | S | S | S | S | S | - | - | -
VARCHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | S | S | S | S | S | - | - | -
LONG VARCHAR FOR BIT DATA | - | - | - | - | - | - | - | - | - | - | S | S | S | S | S | - | - | -
CLOB | - | - | - | - | - | - | - | S | S | S | - | - | - | S | - | - | - | -
BLOB | - | - | - | - | - | - | - | - | - | - | - | - | - | - | S | - | - | -
DATE | - | - | - | - | - | - | - | S | S | - | - | - | - | - | - | S | - | S
TIME | - | - | - | - | - | - | - | S | S | - | - | - | - | - | - | - | S | S
TIME STAMP | - | - | - | - | - | - | - | S | S | - | - | - | - | - | - | S | S | S

Se a conversão for válida, então CAST será permitida. Incompatibilidades de tamanhos entre os tipos de origem e de destino podem causar erros em tempo de execução.

#### Notas

Nesta discussão, os tipos de dado SQL-92 do Derby são categorizados da seguinte maneira:

- numérico
  - numérico exato (SMALLINT, INTEGER, BIGINT, DECIMAL, NUMERIC)
  - numérico aproximado (FLOAT, REAL, DOUBLE PRECISION)
- cadeia
  - cadeia de caracteres (CLOB, CHAR, VARCHAR, LONG VARCHAR)
  - cadeia de bits (BLOB, CHAR FOR BIT DATA, VARCHAR FOR BIT DATA, LONG VARCHAR FOR BIT DATA)
- data/hora
  - DATE
  - TIME
  - TIMESTAMP

#### Conversões de tipos de dado numéricos

Um tipo numérico pode ser convertido para qualquer outro tipo numérico. Se o tipo de destino não puder representar o componente não-fracionário sem truncamento, será lançada uma excessão. Se o destino numérico não puder representar o componente fracionário (escala) da origem numérica, então a origem será truncada em silêncio para caber no destino. Por exemplo, converter 763.1234 para INTEGER tem como resultado 763.

#### Conversões de/para cadeias de bits

As cadeias de bits podem ser convertidas para outras cadeias de bits, mas não para cadeias de caracteres. As cadeias que são convertidas para cadeias de bits são preenchidas com zero no final, para se ajustarem ao tamanho da cadeia de bits do destino. O tipo BLOB é mais limitado, e requer conversão explícita. Na maioria dos casos o tipo BLOB não pode ser convertido de, ou para, outros tipos.

#### Conversões de valores de data/hora

Um valor data/hora sempre pode ser convertido de e para TIMESTAMP. Se DATE for convertido para TIMESTAMP, o componente TIME do TIMESTAMP resultante será sempre 00:00:00. Se um valor de dado TIME for convertido para TIMESTAMP, o componente DATE de TIMESTAMP será definido como o valor de CURRENT_DATE do momento da execução de CAST. Se TIMESTAMP for convertido para DATE, o componente TIME será truncado em silêncio. Se TIMESTAMP for convertido para TIME, o componente DATE será truncado em silêncio.

    SELECT CAST (MILHAS AS INT)
    FROM VÔOS

    -- converter de carimbo do tempo para texto
    INSERT INTO MINHA_TABELA (COLUNA_TEXTO)
    VALUES (CAST (CURRENT_TIMESTAMP AS VARCHAR(100)))

    -- NULL deve ser convertido para algum tipo de dado para poder ser usado
    SELECT LINHA_AÉREA
    FROM LINHAS_AÉREAS
    UNION ALL
    VALUES (CAST (NULL AS CHAR(2)))

    -- conversão de precisão dupla para decimal
    SELECT CAST (TEMPO_VÔO AS DECIMAL(5,2))
    FROM VÔOS

    -- conversão de SMALLINT para BIGINT
    VALUES CAST (CAST (12 AS SMALLINT) AS BIGINT)

Tópico pai: Funções nativas