PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgres:definire un valore predefinito per i fallimenti CAST?

Non esiste un valore predefinito per un CAST:

Un cast di tipo specifica una conversione da un tipo di dati a un altro. PostgreSQL accetta due sintassi equivalenti per i cast dei tipi:

CAST ( expression AS type )
expression::type

Non c'è spazio nella sintassi per nient'altro che l'espressione da trasmettere e il tipo di destinazione desiderato.

Tuttavia, puoi farlo a mano con una semplice funzione:

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;

Quindi puoi dire cose come cast_to_int('pancakes', 0) e ottieni 0 .

PostgreSQL ti consente anche di creare i tuoi cast in modo da poter fare cose come questa:

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

Allora potresti dire

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

e ottieni 0 oppure potresti dire

select cast(some_text_column as integer) from t

e ottieni 0 per la some_text_column valori che non sono interi validi. Se vuoi lanciare varchar Se utilizzi questo cast con impostazione predefinita automatica, dovresti raddoppiare il cast:

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

Solo perché puoi farlo non è una buona idea. Non credo che sostituire il testo standard con il cast intero sia la migliore idea di sempre. L'approccio di cui sopra richiede anche di lasciare lo standard varchar a integer cast da solo, potresti aggirarlo se volessi eseguire l'intera conversione da solo piuttosto che andare pigramente al casting integrato.

La gestione di NULL viene lasciata come un esercizio (facile) per il lettore.