2009-10-28 9 views

Répondre

4

Vous pouvez convertir le varchar à une décimale comme:

select * 
from YourTable 
where CAST(YourField AS decimal) < 40.00 

Ou utilisez la fonction TO_NUMBER():

select * 
from YourTable 
where TO_NUMBER(YourField) < 40.00 

Si le champ est pas toujours un certain nombre, et vous avez un Oracle relativement récent installation, vous pouvez sélectionner des lignes où YourField est numérique:

select * 
from (
    select * 
    from YourTable 
    where regexp_like(YourField, '^-?[[:digit:],.]+$') 
) sub 
where TO_NUMBER(YourField) < 40.00 
5

Vous pouvez le convertir en un numéro en utilisant la fonction TO_NUMBER:

WHERE TO_NUMBER(col) > 39 

Mais attention: si une ligne dans le tableau a une entrée non numérique dans cette colonne, la requête peut échouer avec une erreur:

SQL> create table t (col varchar2(10)); 

Table created. 

SQL> insert into t values ('39.00'); 

1 row created. 

SQL> insert into t values ('40.00'); 

1 row created. 

SQL> insert into t values ('41.00'); 

1 row created. 

SQL> insert into t values ('xxx'); 

1 row created. 

SQL> select * from t where to_number(col) > 39; 
ERROR: 
ORA-01722: invalid number 
+0

+1 pour signaler les pièges. –

4

Si vous voulez comparer les numéros puis utilisez la fonction TO_NUMBER Oracle 11g doc

Je suggère que si vous voulez traiter ainsi comme un certain nombre de la meilleure façon est de changer votre schéma/LDD afin que le 40.00 est stocké dans un champ numérique. Cela signifierait que les comparaisons fonctionnent, que l'accès soit plus efficace, par ex. où champ> x utiliserait un index - où TO_NUMBER (field)> x n'utilise pas d'index et les erreurs de données peuvent être détectées lors de l'insertion plutôt que d'avoir à exécuter des rapports pour trouver des données non numériques.

0
AND (TO_NUMBER(NVL(NAME_FIELD,'0'),'99999999D999','nls_numeric_characters=,.') > 0) 
Questions connexes