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.
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
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;
Si vous devez traiter les colonnes vides comme NULL
s, 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.
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
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
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.