Comment puis-je filtrer les valeurs non numériques dans un champ de texte dans teradata?

StackOverflow https://stackoverflow.com/questions/3559698

  •  01-10-2019
  •  | 
  •  

Question

oI ont une table teradata avec environ 10 millions de disques en elle, qui stocke un champ identifiant numérique en tant que varchar. je dois transférer les valeurs dans ce champ à une colonne bigint dans une autre table, mais je ne peux pas dire simplement coulé (id_field comme bigint) parce que je reçois une erreur de caractère non valide. en regardant à travers les valeurs, je trouve qu'il pourrait y avoir un caractère à une position dans la chaîne, alors disons que la chaîne est varchar (18) je pouvais filtrer les lignes non valides comme ceci:

     where substr(id_field,1,1) not in (/*big,ugly array of non-numeric chars*/)
     and substr(id_field,2,1) not in (/*big,ugly array of non-numeric chars*/)

etc, etc... 

alors le casting fonctionnerait, mais ce n'est pas possible à long terme. il est lent et si la chaîne a 18 caractères possibles, il rend illisible la requête. Comment puis-je filtrer les lignes qui ont une valeur dans ce domaine qui ne sera pas jeté comme bigint sans vérifier chaque caractère individuellement pour un tableau de caractères non numériques?

valeurs par exemple seraient

   123abc464
   a2.3v65
   a_356087
   ........
   000000000
   BOB KNIGHT
   1235468099

les valeurs suivent aucun modèle spécifique, j'ai simplement besoin de filtrer ceux qui contiennent des données ANY non numériques.           123456789 est correct mais 123.abc_c3865 n'est pas ...

Était-ce utile?

La solution

Le meilleur que j'ai jamais réussi est le suivant:

where char2hexint(upper(id_field)) = char2hexint(lower(id_field))

Puisque les caractères majuscules donnent une valeur hexadécimale différente pour réduire les cas, cela fera en sorte que vous avez pas de caractères alphabétiques, mais encore vous laisser avec underscores, et ainsi de suite côlons. Si cela ne répond pas à vos besoins, vous devrez peut-être écrire un UDF.

Autres conseils

A partir de TD14 Teradata ajouté quelques fonctions, il y a maintenant plusieurs façons, par exemple:.

WHERE RTRIM(col, '0123456789') = ''

Mais le plus simple est TO_NUMBER, qui renvoie NULL pour les mauvaises données:

TO_NUMBER(col)

pourrait nous aussi diviser les valeurs dans le champ par un entier « si divisé alors doit être un nombre et sinon et jette une erreur, doit avoir un certain caractère .... » pense que ce serait beaucoup plus vite vient mathématiques impliquées ...

Je l'ai fait face à la même question pour essayer d'exclure alpha caractères de numéros de maison d'adresse de la rue. Ce qui suit fonctionnera que si vous ne me dérange pas concatanating tous les numéros numériques ensemble ...... Il vérifie si la partie supérieure d'une chaîne est égale à la partie inférieure de la chaîne, s'il est un nombre, sinon il devient nul.

select cast(case when upper(substring('12E'from 1 for 1)) = lower(substring('12E'from 1 for 1)) then substring('12E'from 1 for 1) else null end ||
             case when upper(substring('12E'from 2 for 1)) = lower(substring('12E'from 2 for 1)) then substring('12E'from 2 for 1) else null end ||
             case when upper(substring('12E'from 3 for 1)) = lower(substring('12E'from 3 for 1)) then substring('12E'from 3 for 1) else null end ||
             case when upper(substring('12E'from 4 for 1)) = lower(substring('12E'from 4 for 1)) then substring('12E'from 4 for 1) else null end ||
             case when upper(substring('12E'from 5 for 1)) = lower(substring('12E'from 5 for 1)) then substring('12E'from 5 for 1) else null end ||
             case when upper(substring('12E'from 2 for 1)) = lower(substring('12E'from 2 for 1)) then substring('12E'from 2 for 1) else null end
             as integer) 

Essayez d'utiliser ce segment de code

WHERE id_Field NOT LIKE '%[^0-9]%'

J'ai trouvé lins314159 réponse très utile avec un problème similaire. Il peut être un vieux fil, mais pour ce qui vaut la peine de, j'utilisé:

char2hexint (supérieure (id_field)) = char2hexint (inférieur (id_field)) ET substr (id_field, 1,1) IN ( '1' à '9')

pour lancer avec succès les résultats VARCHAR restant à INT

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top