Nie ma wartości domyślnej dla CAST:
typ obsada określa konwersję z jednego typu danych na inny. PostgreSQL przyjmuje dwa odpowiadające na składnie typu odlewów:
CAST (expression AS type)
expression::type
nie ma miejsca w składni do niczego innego niż ekspresji być odlewana i żądanego typu docelowego.
Jednak można to zrobić ręcznie za pomocą prostej funkcji:
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;
Wtedy można powiedzieć takie rzeczy jak cast_to_int('pancakes', 0)
i dostać 0
.
PostgreSQL pozwala ci również create your own casts więc można robić takie rzeczy jak to:
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);
Wtedy można powiedzieć
select cast('pancakes'::text as integer)
i dostać 0
czy można powiedzieć
select cast(some_text_column as integer) from t
i uzyskać 0
dla some_text_column
wartości, które nie są poprawnymi liczbami całkowitymi.Jeśli chciał rzucić varchar
s przy użyciu tej auto-cast zalegających wtedy trzeba by podwójnej obsadzie:
select cast(some_varchar::text as integer) from t
Tylko dlatego, że można zrobić to nie sprawia, że to dobry pomysł. Nie sądzę, aby zastąpienie standardowego tekstu całkowitym rzutem było najlepszym pomysłem. Powyższe podejście wymaga również, abyś sam rzucił standard, mógłbyś sobie z tym poradzić, gdybyś sam wykonał całą konwersję zamiast leniwie puntować do wbudowanego odlewu.
NULL obsługa jest pozostawiona jako (łatwe) ćwiczenie dla czytelnika.
Zmiana domyślnego/oczekiwanego zachowania w ten sposób wydaje mi się ... niebezpieczna. Chcesz mieć możliwość sprawdzenia wartości za pomocą czegoś takiego jak 'IS_NUMERIC()' (funkcja SQL Server), ale wydaje się, że nie istnieje dla PostgreSQL (lub DB2, w moim przypadku). Najprawdopodobniej najlepiej by było, gdybyś utworzył UDF, do którego możesz również podać domyślną wartość. –
Och, nie chcę zmieniać funkcjonalności - po prostu zdefiniuj domyślną dla tej obsady (np. Coś takiego jak 'CAST ('foo' AS INTEGER DEFAULT -1)' lub coś takiego –