2010-03-26 6 views
5

J'ai un problème lors de la conversion de type varchar en type Int dans Informix. En fait je ne sais pas si la valeur est vraiment varchar ou non que je veux convertir en INT. C'est un système de bac à sable.Convertir varchar en numérique dans Informix

Comme exemple: Je suis en train de courir ce genre de

Select telnumber from numbers n 
where Cast(n.telnumber AS INT) between 1234 and 9999 

J'ai eu cette erreur: « Caractère d'une erreur de conversion numérique »

Si je lance cette requête comme ceci:

Select telnumber from numbers n where n.telnumber between '1234' and '9999' 

il apporte un résultat mais pas dans la plage que j'ai définie.

130987 
130710 
130723 

Comment puis-je convertir telnumber à une valeur numérique et l'utiliser dans « entre » 1234 et 9999 gamme

Répondre

0

Je n'utilise Informix, mais cela fonctionne pour moi dans SQL Server:

SELECT telnumber FROM numbers WHERE Abs(n.telnumber) BETWEEN 1234 AND 9999 

Cependant, vous rencontrerez probablement des problèmes car les numéros de téléphone sont vraiment des chaînes et ne sont pas des INT, et finalement toute tentative de les traiter comme INT échouera.

2

L'erreur de conversion suggère que certaines valeurs de la colonne telnumber ne sont pas formatées en tant qu'entier entier - et déclenchent donc l'erreur que vous voyez lors de la tentative de conversion.

La deuxième requête répertorie les valeurs supplémentaires car «123» se situe entre «10» et «20» lorsque comparées en tant que chaînes.

Si vous voulez limiter à 4 chiffres, vous pouvez ensuite utiliser:

SELECT telnumber 
    FROM numbers n 
WHERE n.telnumber BETWEEN '1234' AND '9999' 
    AND LENGTH(n.telnumber) = 4 

Cela comprendrait encore « 1AA2 » dans le jeu de résultats.

La prise en charge de l'expression régulière complète (telle que PCRE) n'est malheureusement pas présente en standard dans IDS. Toutefois, l'opérateur non standard MATCHS vous permettra de le faire:

SELECT telnumber 
    FROM numbers n 
WHERE n.telnumber BETWEEN '1234' AND '9999' 
    AND LENGTH(n.telnumber) = 4 
    AND n.telnumber MATCHES '[0-9][0-9][0-9][0-9]' 

C'est une expression régulière simple - mais le « * » est un style globbing shell 'une séquence de zéro ou plusieurs caractères plutôt que le Kleene Star 'zéro ou plusieurs répétitions du caractère précédent'.

2

simple Réponse: Informix a construit dans la coulée, que vous pouvez utiliser comme ceci:

SELECT telnumber 
FROM numbers n 
WHERE n.telnumber::integer BETWEEN 1234 AND 9999; 

De plus:

Cependant, comme Jonathan Leffler a souligné précédemment, il semble que votre ensemble de données contient des valeurs qui ne sont pas nécessairement convertibles en entiers. Si c'est le cas, alors ce n'est peut-être pas le schéma idéal pour vos objectifs? Si vous avez absolument besoin de caractères non numériques ici (par exemple, je suppose que vous finirez avec l'un des '-', '(' ou ')'), vous pouvez essayer d'exclure les lignes qui correspondent aux caractères non numériques:

SELECT telnumber 
FROM numbers n 
WHERE n.telnumber not matches "*[0-9]*" 
AND n.telnumber::integer BETWEEN 1234 AND 9999; 

Vous pouvez également essayer d'utiliser une procédure stockée, en utilisant un bloc ON EXCEPTION? (L'erreur de conversion de caractères en numérique est l'erreur 1213).

Pour en savoir plus sur l'utilisation de 'cas d'exception': http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls946.htm

Pour en savoir plus sur la définition et l'utilisation des procédures stockées: http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls906.htm

0

Pour moi, cela a fonctionné:

Select * 
From table1 
where cast(left(field1,7) as numeric) BETWEEN 2128042 and 2128045 
Questions connexes