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.


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

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; 

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.


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

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

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



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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.