sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgres:definiera ett standardvärde för CAST-fel?

Det finns inget standardvärde för en CAST:

En typcast specificerar en konvertering från en datatyp till en annan. PostgreSQL accepterar två ekvivalenta syntaxer för typcasts:

CAST ( expression AS type )
expression::type

Det finns inget utrymme i syntaxen för något annat än uttrycket som ska castas och önskad måltyp.

Du kan dock göra det för hand med en enkel 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;

Sedan kan du säga saker som cast_to_int('pancakes', 0) och få 0 .

PostgreSQL låter dig också skapa dina egna casts så att du kan göra så här:

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

Då kan man säga

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

och få 0 eller så kan man säga

select cast(some_text_column as integer) from t

och få 0 för some_text_column värden som inte är giltiga heltal. Om du ville gjuta varchar Om du använder denna automatiska förinställda cast måste du dubbelcasta:

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

Bara för att du kan göra detta gör det inte till en bra idé. Jag tror inte att det är den bästa idén någonsin att ersätta standardtexten till heltalscast. Ovanstående tillvägagångssätt kräver också att du lämnar standarden varchar till integer casting ensam, du skulle kunna komma runt det om du ville göra hela konverteringen själv istället för att slö till den inbyggda castingen.

NULL-hantering lämnas som en (lätt) övning för läsaren.



  1. är det möjligt att ha alfanumerisk sekvensgenerator i sql

  2. Den parameteriserade frågan ..... förväntar sig parametern '@units', som inte angavs

  3. SQL Unik begränsning över flera tabeller

  4. Förstå dödlägen i MySQL och PostgreSQL