2012-05-09 18 views
68

Estoy importando datos de una tabla que tiene feeds sin formato en Varchar, necesito importar una columna en varchar en una columna de cadena. Intenté usar el <column_name>::integer y el to_number(<column_name>,'9999999'), pero recibo errores, ya que hay algunos campos vacíos. Necesito recuperarlos como vacíos o nulos en la nueva tabla.cadena de transmisión a entero - Postgres

Amablemente déjenme saber si hay una función para la misma.

+3

¿Podría mostrarnos el mensaje de error? Eso ayudaría a –

Respuesta

72

conjetura salvaje: Si su valor es una cadena vacía, se puede utilizar NULLIF para reemplazarlo por un NULL:

SELECT 
    NULLIF(your_value, '')::int 
18

Si necesita tratamiento de las columnas vacías como NULL s, intente esto:

SELECT CAST(nullif(<column>, '') AS integer); 

Por otro lado, si usted tiene NULL valores que se necesita para evitar, tratar:

SELECT CAST(coalesce(<column>, '0') AS integer); 

Estoy de acuerdo, el mensaje de error ayudaría mucho.

8

No puedo hacer ningún comentario (¿muy poca reputación? Soy bastante nuevo) en la publicación de Lukas.

En mi configuración PG to_number(NULL) no funciona, así que mi solución sería:

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END 
FROM table 
+1

Esto debería funcionar, pero debería ser un equivalente exacto del enfoque menos detallado 'NULLIF()'. El estándar realmente define NULLIF como una forma del predicado CASE. – kgrittn

41

Incluso puede ir uno más y restringir en este campo coalescencia tales como, por ejemplo: -

SELECT CAST(coalesce(<column>, '0') AS integer) as new_field 
from <table> 
where CAST(coalesce(<column>, '0') AS integer) >= 10; 
14

La única manera de que tenga éxito a no tener un error debido a NULL, o Caracteres especiales o cadena vacía es al hacer esto:

SELECT REGEXP_REPLACE(COALESCE(<column>, '0'), '[^0-9]*' ,'0')::integer FROM table 
+2

Para mí (9.6.2) esto fue lo único que funcionó, todas las demás respuestas fallaron. –