2010-07-14 5 views
0

VERSION COURTE: Quelle est la meilleure façon de convertir "5-" en nombre pour le stocker dans un tableau en tant que nombre?Oracle: stocker "5-" sous forme de nombre

LONGUE VERSION: Voici le problème, j'ai une table que je suis en train de lire de primaire composé de VARCHAR2s. J'attrape les données de certains champs et les stocke dans une autre table sans modification. Dans un champ, je reçois "5-" et essaye de le stocker dans un champ NUMBER qui lance une erreur car il ne peut pas le convertir en nombre.

Quelqu'un peut-il me dire s'il existe une bonne pratique pour traiter des données comme celle-ci? Cela semble être un problème financier commun. Je suis sûr que je pourrais enlever '-s et puis si trouvé le mettre à l'avant, mais je voudrais savoir sur la meilleure façon de traiter cela.

Répondre

5

Pour fournir une réponse complète, nous aurions besoin de connaître le format des valeurs, en plus de celui '5' dans le champ varchar2. (S'il vous plaît mettre à jour votre question.)

un des problèmes suivants convertira un « 5 » au nombre -5:

to_number('5-', '9S') 
to_number('5-', '9MI') 
  1. Si vous pouvez avoir plus d'un chiffre, le nombre de nines doit être augmenté.
  2. Si vous avez des séparateurs, tels que des virgules, ils doivent être pris en compte.
  3. Dans le cas du format '9S', un signe plus doit être fourni pour les nombres positifs. (Le nombre 5 doit être '5+' car '5' et '5' vont générer une erreur.) Dans le cas du format '9MI', un espace doit être prévu pour les nombres positifs. ('5' est acceptable, mais '5' donnera une erreur).
  4. Et cela ne fonctionnerait pas si la même colonne contenait des valeurs dans les formats '-5' et '5-'. Si ce n'est que quelques numéros '9999-' qui vous lancent, et que tout le reste se convertit bien en utilisant votre méthode actuelle, je testerais le dernier caractère pour voir s'il était négatif et si c'est le cas, convertissez le reste et multiplier par -1:

    Table dropped. 
    
    SQL> create table t (v varchar2(10)); 
    
    Table created. 
    
    SQL> insert into t values ('-5'); 
    
    1 row created. 
    
    SQL> insert into t values ('5-'); 
    
    1 row created. 
    
    SQL> insert into t values ('9999-'); 
    
    1 row created. 
    
    SQL> insert into t values ('5'); 
    
    1 row created. 
    
    SQL> select v 
        2  , case when substr(v, length(v)) = '-' 
        3   then -1 * cast(substr(v, 1, length(v) - 1) as number) 
        4   else cast(v as number) end as V_NUM 
        5 from t; 
    
    V    V_NUM 
    ---------- ---------- 
    -5     -5 
    5-     -5 
    9999-   -9999 
    5     5 
    
    SQL> spool off 
    
+0

réponse fantastique. La plage de données est un nombre unique (0-9) avec ou sans + ou - je fusionne des données provenant de 3 sources différentes, donc ce n'est pas exactement uniforme. Merci pour vos suggestions. C'était très utile. –

Questions connexes