J'ai eu le même genre de besoin et trouvé cela bien pour moi (postgres 8.4):
CAST((COALESCE(myfield,'0')) AS INTEGER)
Certains cas de test pour démontrer:
db=> select CAST((COALESCE(NULL,'0')) AS INTEGER);
int4
------
0
(1 row)
db=> select CAST((COALESCE('','0')) AS INTEGER);
int4
------
0
(1 row)
db=> select CAST((COALESCE('4','0')) AS INTEGER);
int4
------
4
(1 row)
db=> select CAST((COALESCE('bad','0')) AS INTEGER);
ERROR: invalid input syntax for integer: "bad"
Si vous avez besoin pour gérer la Si le champ contient un texte non numérique (par exemple "100bad"), vous pouvez utiliser regexp_replace pour supprimer les caractères non numériques avant le cast.
CAST(REGEXP_REPLACE(COALESCE(myfield,'0'), '[^0-9]+', '', 'g') AS INTEGER)
valeurs Puis text/varchar comme « b3ad5 » aussi donner des chiffres
db=> select CAST(REGEXP_REPLACE(COALESCE('b3ad5','0'), '[^0-9]+', '', 'g') AS INTEGER);
regexp_replace
----------------
35
(1 row)
Pour répondre aux préoccupations de Chris Cogdon avec la solution ne donnant pas 0 pour tous les cas, y compris un cas comme « mauvais » (pas de caractères à deux chiffres du tout), je fait cette déclaration ajustée:
CAST((COALESCE(NULLIF(REGEXP_REPLACE(myfield, '[^0-9]+', '', 'g'), ''), '0')) AS INTEGER);
Il fonctionne de manière similaire aux solutions plus simples, à l'exception donnera 0 lorsque la valeur est de convertir les caractères non-chiffres seulement, su ch comme « mauvais »:
db=> select CAST((COALESCE(NULLIF(REGEXP_REPLACE('no longer bad!', '[^0-9]+', '', 'g'), ''), '0')) AS INTEGER);
coalesce
----------
0
(1 row)
Je recommande fortement d'aller avec la suggestion de Matthew. Cette solution a des problèmes avec les chaînes qui ressemblent à des nombres mais qui sont plus grandes que la valeur maximale que vous pouvez placer dans un nombre entier. – pilif
je commente le deuxième pilif. cette valeur maximale est un bug qui attend de se produire. le point de ne pas lancer une erreur est de ne pas lancer une erreur lorsque les données sont invalides. cette réponse acceptée ne résout PAS cela. merci Matthew! bon travail! –
Aussi bien que la réponse de Matthew est, j'avais juste besoin d'un moyen de manipulation rapide et sale pour vérifier certaines données. J'avoue également que mes propres connaissances manquent actuellement dans la définition des fonctions en SQL. Je ne m'intéressais qu'aux nombres compris entre 1 et 5 chiffres, donc j'ai changé l'expression rationnelle en 'E '\\ d {1,5} $''. – Bobort