conversión de cadena a entero - Postgres

123

Estoy importando datos de una tabla que tiene feeds sin procesar en Varchar, necesito importar una columna en varchar a una columna de cadena. Intenté usar el <column_name>::integerasí como 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.

Por favor avíseme si hay una función para el mismo.

Vijay DJ
fuente
5
¿Podrías mostrarnos el mensaje de error? Eso ayudaría
Frank Heikens

Respuestas:

126

Conjetura salvaje: si su valor es una cadena vacía, puede usar NULLIF para reemplazarlo por un NULL:

SELECT
    NULLIF(your_value, '')::int
Frank Heikens
fuente
56

Incluso puede ir más allá y restringir este campo combinado como, por ejemplo: -

SELECT CAST(coalesce(<column>, '0') AS integer) as new_field
from <table>
where CAST(coalesce(<column>, '0') AS integer) >= 10; 
raído
fuente
28

Si necesita tratar las columnas vacías como NULLs, intente esto:

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

Por otro lado, si tiene NULLvalores que necesita evitar, intente:

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

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

Vyegorov
fuente
25

La única forma en que consigo no tener un error debido a NULL, o caracteres especiales o una cadena vacía es haciendo esto:

SELECT REGEXP_REPLACE(COALESCE(<column>::character varying, '0'), '[^0-9]*' ,'0')::integer FROM table
Charles Hamel
fuente
2
Para mí (9.6.2) esto fue lo único que funcionó, todas las demás respuestas fallaron.
Jasper de Vries
2
¿No podrías agregar un WHERE <column> != NULL?
Matthieu
14

No puedo comentar (¿muy poca reputación? Soy bastante nuevo) sobre la publicación de Lukas.

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

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END
FROM table
Niko
fuente
1
Esto debería funcionar, pero debería ser un equivalente exacto del NULLIF()enfoque menos detallado . El estándar realmente define NULLIF como una forma del predicado CASE.
kgrittn
13

Si el valor contiene caracteres no numéricos, puede convertir el valor en un número entero de la siguiente manera:

SELECT CASE WHEN <column>~E'^\\d+$' THEN CAST (<column> AS INTEGER) ELSE 0 END FROM table;

El operador CASE verifica la <columna>, si coincide con el patrón de números enteros, convierte la tasa en un número entero; de lo contrario, devuelve 0

Igor Ostrovsky
fuente
1

puedes usar esta consulta

SUM(NULLIF(conversion_units, '')::numeric)
Abdul Quadir
fuente
1

Problema común

Tipo ingenuamente lanzando cualquier cadena en un entero como ese

SELECT ''::integer

A menudo resulta en el famoso error:

Query failed: ERROR: invalid input syntax for integer: ""

Problema

PostgreSQL no tiene una función predefinida para convertir de forma segura cualquier cadena en un número entero.

Solución

Cree una función definida por el usuario inspirada en la función intval () de PHP .

CREATE FUNCTION intval(character varying) RETURNS integer AS $$

SELECT
CASE
    WHEN length(btrim(regexp_replace($1, '[^0-9]', '','g')))>0 THEN btrim(regexp_replace($1, '[^0-9]', '','g'))::integer
    ELSE 0
END AS intval;

$$
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;

Uso

/* Example 1 */
SELECT intval('9000');
-- output: 9000

/* Example 2 */
SELECT intval('9gag');
-- output: 9

/* Example 3 */
SELECT intval('the quick brown fox jumps over the lazy dog');
-- output: 0
Abel Callejo
fuente