2011-01-21 9 views
12

quiero crear REPARTO una función adecuada para convertir 'carácter variable' a 'entero'. ¿Alguien puede sugerir una función? Todo lo que intento falla.Postgresql. CREAR REPARTO 'caracteres de longitud variable' a 'entero'

+4

Usted debe fijar su SQL a no confiar en implict arroja. No confíe en las implícitas en sus declaraciones, nunca. –

+0

Estoy de acuerdo. Sin embargo, no puedo. Estoy usando una pieza de software estándar. – Simon

Respuesta

17

Use esto:

CREATE CAST (varchar AS integer) WITH INOUT [AS IMPLICIT]; 

Utiliza las funciones de entrada/salida de los tipos de datos implicados.

+2

Más de 3k vistas/SP/consultas para revisar y reparar conversiones implícitas ... entonces has venido con esta f **** fácil solución. Me dará mucho más tiempo. Gracias, ahorrador de trabajo! (Me pregunto por qué los desarrolladores de Postgres no pusieron un parámetro en postgresql.conf para esto ...) – Christian

+3

Nosotros (los desarrolladores de PostgreSQL) vivimos y aprendemos. –

0

me supuesto de que desea volver al comportamiento de PostgreSQL 8.3 en relación con la conversión implícita.

Ver esta entrada de blog para ejemplos:
http://petereisentraut.blogspot.com/2008/03/readding-implicit-casts-in-postgresql.html

Ah: y error que proveedor del software para solucionar el SQL rota;)

Editar

Esto debe hacerlo:

 
CREATE FUNCTION toint(varchar) 
    RETURNS integer 
    STRICT IMMUTABLE LANGUAGE SQL AS 
'SELECT cast($1 as integer);'; 

CREATE CAST (varchar AS integer) WITH FUNCTION toint(varchar); 
+0

Sí. Pero me encontré con que le falta int4 (varchar) – Simon

+0

Contiene un elenco de número entero que es lo mismo que int4 si no me equivoco. –

+0

Perdóname si estoy siendo estúpido, pero ninguna de las funciones devuelve un número entero. Espero hacer CREATE CAST (varchar como entero) ... – Simon

1

La función anterior es efectivo si actualiza su SQL que hacer una conversión explícita. Sin embargo, si se agrega 'implícito' hasta el final de su declaración de "crear fundido", Postgres será capaz de calcular automáticamente lo que está tratando de hacer cuando se compara un número entero con un varchar que se puede convertir en un entero .

aquí está mi declaración actualizada que parecía funcionar "implícitamente":

CREATE FUNCTION toint(varchar) 
    RETURNS integer 
    STRICT IMMUTABLE LANGUAGE SQL AS 
'SELECT cast($1 as integer);'; 

CREATE CAST (varchar AS integer) WITH FUNCTION toint(varchar) as Implicit; 
+0

Esta función me ayudó a lanzar campos varchar como un usuario de base de datos normal que emite consultas en lugar de lanzar el tipo en sí. – johnmartirano

0

que tiene el mismo error. Tengo una columna

código

declarada como carácter de tipo variable (20) y una variable local

l_code

declarada como tipo int.

Solucioné reemplazando en el procedimiento

SELECT 
... 
WHERE 
code = l_code AND 
.. 

con

code = cast(l_code as character varying) AND 
Cuestiones relacionadas