PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgres :définir une valeur par défaut pour les échecs CAST ?

Il n'y a pas de valeur par défaut pour un CAST :

Un cast de type spécifie une conversion d'un type de données à un autre. PostgreSQL accepte deux syntaxes équivalentes pour les conversions de type :

CAST ( expression AS type )
expression::type

Il n'y a pas de place dans la syntaxe pour autre chose que l'expression à caster et le type cible souhaité.

Cependant, vous pouvez le faire à la main avec une fonction 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;

Ensuite, vous pouvez dire des choses comme cast_to_int('pancakes', 0) et obtenez 0 .

PostgreSQL vous permet également de créer vos propres distributions afin que vous puissiez faire des choses comme ceci :

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

Alors vous pourriez dire

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

et obtenez 0 ou vous pourriez dire

select cast(some_text_column as integer) from t

et obtenez 0 pour la some_text_column valeurs qui ne sont pas des entiers valides. Si vous vouliez caster varchar s en utilisant cette diffusion automatique par défaut, vous devrez alors doubler la diffusion :

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

Ce n'est pas parce que vous pouvez le faire que c'est une bonne idée. Je ne pense pas que remplacer le texte standard par une distribution entière soit la meilleure idée de tous les temps. L'approche ci-dessus nécessite également que vous laissiez le standard varchar en integer lancer seul, vous pourriez contourner cela si vous vouliez faire toute la conversion vous-même plutôt que de vous lancer paresseusement dans le casting intégré.

La manipulation de NULL est laissée comme un exercice (facile) pour le lecteur.