PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgres:definir um valor padrão para falhas CAST?


Não há valor padrão para um CAST:

Uma conversão de tipo especifica uma conversão de um tipo de dados para outro. O PostgreSQL aceita duas sintaxes equivalentes para conversão de tipos:
CAST ( expression AS type )
expression::type

Não há espaço na sintaxe para nada além da expressão a ser convertida e o tipo de destino desejado.

No entanto, você pode fazer isso manualmente com uma função simples:
create or replace function cast_to_int(text, integer) returns integer as $$
begin
    return cast($1 as integer);
exception
    when invalid_text_representation then
        return $2;
end;
$$ language plpgsql immutable;

Então você pode dizer coisas como cast_to_int('pancakes', 0) e obtenha 0 .

O PostgreSQL também permite que você crie seus próprios casts para que você possa fazer coisas assim:
create or replace function cast_to_int(text) returns integer as $$
begin
    -- Note the double casting to avoid infinite recursion.
    return cast($1::varchar as integer);
exception
    when invalid_text_representation then
        return 0;
end;
$$ language plpgsql immutable;

create cast (text as integer) with function cast_to_int(text);

Então você poderia dizer
select cast('pancakes'::text as integer)

e obtenha 0 ou você poderia dizer
select cast(some_text_column as integer) from t

e obtenha 0 para a some_text_column valores que não são inteiros válidos. Se você quiser converter varchar s usando essa conversão padrão automática, você teria que fazer uma conversão dupla:
select cast(some_varchar::text as integer) from t

Só porque você pode fazer isso não faz com que seja uma boa ideia. Eu não acho que substituir o texto padrão por conversão inteira seja a melhor ideia de todos os tempos. A abordagem acima também requer que você deixe o padrão varchar para integer lançado sozinho, você poderia contornar isso se quisesse fazer toda a conversão sozinho, em vez de ir preguiçosamente para o elenco embutido.

O manuseio de NULL é deixado como um exercício (fácil) para o leitor.