sql >> Databáze >  >> RDS >> PostgreSQL

Postgres:definovat výchozí hodnotu pro selhání CAST?

Pro CAST:

neexistuje žádná výchozí hodnota

Přetypování typu určuje převod z jednoho datového typu na jiný. PostgreSQL přijímá dvě ekvivalentní syntaxe pro přetypování typu:

CAST ( expression AS type )
expression::type

V syntaxi není místo pro nic jiného než výraz, který má být přetypován, a požadovaný cílový typ.

Můžete to však udělat ručně pomocí jednoduché funkce:

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;

Pak můžete říct věci jako cast_to_int('pancakes', 0) a získejte 0 .

PostgreSQL vám také umožňuje vytvářet vlastní casty, abyste mohli dělat věci jako je toto:

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

Pak byste mohli říct

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

a získejte 0 nebo můžete říct

select cast(some_text_column as integer) from t

a získejte 0 pro some_text_column hodnoty, které nejsou platnými celými čísly. Pokud jste chtěli přenést varchar Pokud použijete toto automaticky výchozí přetypování, budete muset přetypovat dvakrát:

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

To, že to dokážete, z toho ještě nedělá dobrý nápad. Nemyslím si, že nahrazení standardního textu celočíselným přetypováním je vůbec nejlepší nápad. Výše uvedený přístup také vyžaduje, abyste opustili standardní varchar na integer casting alone, to by se dalo obejít, pokud byste chtěli udělat celou konverzi sami a ne líně prát na vestavěný casting.

Zpracování NULL je ponecháno jako (snadné) cvičení pro čtenáře.



  1. Podmíněně definujte kurzor

  2. Ekvivalent varchar(max) v MySQL?

  3. MySql Table Insert, pokud neexistuje, jinak aktualizujte

  4. Ukládání obrázků na SQL Server?