sql >> Base de Datos >  >> RDS >> PostgreSQL

Postgres:¿definir un valor predeterminado para las fallas de CAST?

No hay un valor predeterminado para CAST:

Una conversión de tipos especifica una conversión de un tipo de datos a otro. PostgreSQL acepta dos sintaxis equivalentes para conversiones de tipos:

CAST ( expression AS type )
expression::type

No hay espacio en la sintaxis para nada más que la expresión que se va a convertir y el tipo de destino deseado.

Sin embargo, puedes hacerlo a mano con una función simple:

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;

Entonces puedes decir cosas como cast_to_int('pancakes', 0) y obtiene 0 .

PostgreSQL también le permite crear sus propios moldes para que pueda hacer cosas como esta:

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);

Entonces podrías decir

select cast('pancakes'::text as integer)

y obtiene 0 o podrías decir

select cast(some_text_column as integer) from t

y obtiene 0 para la some_text_column valores que no son enteros válidos. Si quisiera lanzar varchar Si usa esta conversión predeterminada automática, entonces tendría que hacer una doble conversión:

select cast(some_varchar::text as integer) from t

El hecho de que puedas hacer esto no significa que sea una buena idea. No creo que reemplazar el texto estándar por una conversión de enteros sea la mejor idea. El enfoque anterior también requiere que deje el estándar varchar a integer lanzar solo, podría evitarlo si quisiera hacer toda la conversión usted mismo en lugar de patear perezosamente al lanzamiento incorporado.

El manejo de NULL se deja como un ejercicio (fácil) para el lector.