PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgres:zdefiniować domyślną wartość dla niepowodzeń CAST?

Nie ma wartości domyślnej dla CAST:

Rzutowanie typu określa konwersję z jednego typu danych na inny. PostgreSQL akceptuje dwie równoważne składnie dla rzutowania typu:

CAST ( expression AS type )
expression::type

W składni nie ma miejsca na nic poza wyrażeniem do rzutowania i żądanym typem docelowym.

Możesz to jednak 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;

Następnie możesz powiedzieć takie rzeczy jak cast_to_int('pancakes', 0) i uzyskaj 0 .

PostgreSQL pozwala również na tworzenie własnych rzutów, dzięki czemu możesz robić takie rzeczy:

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żesz powiedzieć

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

i uzyskaj 0 lub możesz powiedzieć

select cast(some_text_column as integer) from t

i uzyskaj 0 dla some_text_column wartości, które nie są prawidłowymi liczbami całkowitymi. Jeśli chcesz przesłać varchar s używając tego automatycznego rzutowania, musisz użyć podwójnego rzutowania:

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

Tylko dlatego, że możesz to zrobić, nie jest to dobry pomysł. Nie sądzę, aby zastąpienie standardowego tekstu rzutowaniem liczb całkowitych było najlepszym pomysłem. Powyższe podejście wymaga również pozostawienia standardowego varchar na integer samo rzucanie, możesz to obejść, jeśli chcesz wykonać całą konwersję samodzielnie, zamiast leniwie wbijać się do wbudowanego castingu.

Obsługa NULL jest pozostawiona jako (łatwe) ćwiczenie dla czytelnika.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak grupować według miesiąca w PostgreSQL

  2. Dlaczego Postgres nie korzysta z indeksu?

  3. Postgres:Dodaj ograniczenie, jeśli jeszcze nie istnieje

  4. Jak Cosh() działa w PostgreSQL

  5. Czy lepiej jest utworzyć indeks przed wypełnieniem tabeli danymi, czy po umieszczeniu danych?