Няма стойност по подразбиране за CAST:
Прехвърлянето на тип определя преобразуване от един тип данни в друг. PostgreSQL приема два еквивалентни синтаксиса за привеждане на типове:
CAST ( expression AS type ) expression::type
В синтаксиса няма място за нищо друго освен израза, който трябва да бъде прехвърлен, и желания тип цел.
Можете обаче да го направите на ръка с проста функция:
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;
След това можете да кажете неща като cast_to_int('pancakes', 0)
и вземете 0
.
PostgreSQL също ви позволява да създавате свои собствени предавания, за да можете да правите неща като това:
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);
Тогава бихте могли да кажете
select cast('pancakes'::text as integer)
и вземете 0
или бихте могли да кажете
select cast(some_text_column as integer) from t
и вземете 0
за some_text_column
стойности, които не са валидни цели числа. Ако искате да пуснете varchar
Ако използвате това автоматично прехвърляне по подразбиране, тогава ще трябва да прехвърляте двойно:
select cast(some_varchar::text as integer) from t
Само защото можете да направите това, не го прави добра идея. Не мисля, че замяната на стандартния текст с цяло число е най-добрата идея. Горният подход изисква също да оставите стандартния varchar
към integer
само cast, можете да го заобиколите, ако искате сами да извършите цялото преобразуване, а не лениво да се насочвате към вграденото кастинг.
Обработката с NULL е оставена като (лесно) упражнение за читателя.