Der er ingen standardværdi for en CAST:
Et typecast angiver en konvertering fra én datatype til en anden. PostgreSQL accepterer to ækvivalente syntakser for typecasts:
CAST ( expression AS type )
expression::type
Der er ikke plads i syntaksen til andet end udtrykket, der skal castes, og den ønskede måltype.
Du kan dog gøre det i hånden med en simpel funktion:
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;
Så kan du sige ting som cast_to_int('pancakes', 0)
og få 0
.
PostgreSQL lader dig også oprette dine egne casts, så du kan gøre ting som dette:
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);
Så kunne man sige
select cast('pancakes'::text as integer)
og få 0
eller man kan sige
select cast(some_text_column as integer) from t
og få 0
for some_text_column
værdier, der ikke er gyldige heltal. Hvis du ville kaste varchar
Hvis du bruger denne automatiske standardcast, skal du dobbeltcaste:
select cast(some_varchar::text as integer) from t
Bare fordi du kan gøre dette, gør det det ikke til en god idé. Jeg tror ikke, at det er den bedste idé nogensinde at erstatte standardteksten med heltalscast. Ovenstående tilgang kræver også, at du forlader standarden varchar
til integer
cast alene, kunne du komme uden om det, hvis du ville lave hele konverteringen selv i stedet for dovent at satse på den indbyggede casting.
NULL-håndtering efterlades som en (let) øvelse for læseren.