web-dev-qa-db-fra.com

chaîne de caractères convertie en entier - Postgres

J'importe des données d'une table contenant des fils bruts dans Varchar. Je dois importer une colonne de varchar dans une colonne de chaîne. J'ai essayé d'utiliser <column_name>::integer ainsi que to_number(<column_name>,'9999999'), mais je reçois des erreurs, car il y a quelques champs vides, je dois les récupérer vides ou nuls dans la nouvelle table.

Faites-moi savoir s'il existe une fonction pour la même chose.

109
Vijay DJ

Devinette sauvage: Si votre valeur est une chaîne vide, vous pouvez utiliser NULLIF pour la remplacer par une valeur NULL:

SELECT
    NULLIF(your_value, '')::int
113
Frank Heikens

Vous pouvez même aller plus loin et restreindre ce champ fusionné tel que, par exemple: -

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

Si vous devez traiter les colonnes vides comme NULLs, essayez ceci:

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

Par contre, si vous avez des valeurs NULL que vous devez éviter, essayez:

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

Je suis d'accord, un message d'erreur aiderait beaucoup.

25
vyegorov

La seule façon dont j'ai réussi à ne pas avoir d'erreur en raison de la valeur NULL, de caractères spéciaux ou d'une chaîne vide est la suivante:

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

Je ne peux pas commenter (trop peu de réputation? Je suis assez nouveau) sur le post de Lukas.

Sur ma PG, la configuration to_number(NULL) ne fonctionne pas, ma solution serait donc:

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END
FROM table
12
niko

Si la valeur contient des caractères non numériques, vous pouvez convertir la valeur en entier comme suit:

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

L'opérateur CASE vérifie la <colonne>. S'il correspond au modèle d'entier, il convertit le débit en un entier, sinon il renvoie 0.

8
Igor Ostrovsky