no hay ningún valor predeterminado para un CAST:
Un tipo fundido especifica una conversión de un tipo de datos a otro. PostgreSQL acepta dos sintaxis equivalentes para conversiones de tipo:
CAST (expression AS type)
expression::type
No hay lugar en la sintaxis para otra cosa que la expresión nada para ser fundido y el tipo de destino deseado.
Sin embargo, puede hacerlo a mano con una función simple:
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;
entonces se puede decir cosas como cast_to_int('pancakes', 0)
y obtener 0
.
PostgreSQL también le permite create your own casts por lo que podría hacer cosas como esta:
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);
Entonces se podría decir
select cast('pancakes'::text as integer)
y obtener 0
o se podría decir
select cast(some_text_column as integer) from t
y obtener 0
para el some_text_column
valores que no son enteros válidos.Si quería echar varchar
s utilizando esta auto-morosos fundido entonces habría que doble reparto:
select cast(some_varchar::text as integer) from t
El hecho de que usted puede hacer esto no significa que sea una buena idea. No creo que reemplazar el texto estándar por un elenco entero sea la mejor idea de la historia. El enfoque anterior también requiere que dejes el estándar varchar
en integer
por separado, podrías evitarlo si quisieras hacer toda la conversión tú mismo en lugar de pedalear perezosamente al casting integrado.
El manejo NULL se deja como un ejercicio (fácil) para el lector.
Cambiar el comportamiento predeterminado/esperado de esta manera me parece ... peligroso. Desea la capacidad de verificar el valor con algo como 'IS_NUMERIC()' (función del Servidor SQL), pero no parece existir para Postgresql (o DB2, en mi caso). Probablemente lo mejor sería crear una UDF, a la que también podría asignarle un valor predeterminado. –
Oh, no quiero cambiar la funcionalidad, simplemente defina un valor predeterminado para ese molde (por ejemplo, algo así como 'CAST ('foo' AS INTEGER DEFAULT -1)' o algo. –