comment puis-je filtrer les valeurs non numériques dans un champ de texte dans teradata?
oI ont un teradata table avec environ 10 millions de données, qui stocke un identifiant numérique champ de type varchar. j'ai besoin de transférer les valeurs dans ce champ d'une colonne bigint dans une autre table, mais je ne peux pas simplement dire cast(id_field comme bigint) parce que j'ai un caractère non valide erreur. en regardant à travers les valeurs, je trouve qu'il pourrait être un personnage à n'importe quelle position dans la chaîne, donc, disons que la chaîne est de type varchar(18) j'ai pu filtrer lignes invalides de la sorte :
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...
puis le casting, mais ce n'est pas réalisable dans le long terme. c'est lent et si la chaîne a 18 caractères possibles, il rend la requête illisible. comment puis-je filtrer les lignes qui ont une valeur dans ce champ qui ne sera pas jeté comme un bigint sans vérifier chaque personnage individuellement pour un tableau de caractères non numériques?
exemple de valeurs de
123abc464
a2.3v65
a_356087
........
000000000
BOB KNIGHT
1235468099
les valeurs de suivre les pas de modèles spécifiques, j'ai tout simplement besoin de filtrer ceux qui contiennent des données non numériques.
123456789 est correct mais 123.abc_c3865 n'est pas...
OriginalL'auteur Chris Drappier | 2010-08-24
Vous devez vous connecter pour publier un commentaire.
Le meilleur que j'ai jamais réussi, c'est ce:
Depuis majuscules donner une autre valeur hexadécimale à la baisse des cas, cela permettra d'assurer que vous n'avez pas de caractères alphabétiques, mais encore vous laisser avec des traits de soulignement, deux-points et ainsi de suite. Si ce n'est pas de répondre à vos exigences, vous pouvez avoir besoin d'écrire un UDF.
Fonction définie par l'utilisateur, écrit en C. Il y en a une pour la vérification de BigInts developer.teradata.com/blog/madmac/2010/03/...
OriginalL'auteur lins314159
De départ avec TD14 Teradata ajouté quelques fonctions, maintenant il y a de multiples façons, par exemple:
Mais le plus simple est TO_NUMBER, qui retourne la valeur NULL pour les données de mauvaise qualité:
OriginalL'auteur dnoeth
pourrait-on essayer de diviser les valeurs dans le champ par certains integer "si divisé doit être un nombre, et si non, et jette quelque erreur,doit avoir du caractère...." suppose que ce serait beaucoup rapide que vient de mathématiques...
OriginalL'auteur a_sillyguy
J'ai été confronté à la même question pour essayer d'exclure les caractères alpha de l'adresse civique numéro de la maison. Ce qui suit fonctionnera si vous n'avez pas l'esprit concatanating tous le numérique les chiffres......
Il vérifie si la partie supérieure d'une chaîne est égale à la plus faible de la chaîne, si c'est un nombre, si ce n'est elle devient nulle.
OriginalL'auteur rossinaus
Essayez d'utiliser ce segment de code
TD14 ajouté quelques fonctions sont basées sur l'expression régulière:
WHERE REGEXP_SIMILAR(id_field , '[0-9]') = 1
, avant de TD14 il pourrait y avoir oTRANSLATE:WHERE oTranslate('id_field', '0123456789','') = ''
OriginalL'auteur Kaveh
J'ai trouvé lins314159 réponse très utile avec un problème similaire. Il peut être un vieux thread mais pour ce que ça vaut, j'ai utilisé:
char2hexint(en haut(id_field)) = char2hexint(en bas(id_field)) ET substr(id_field,1,1) DANS ('1' à '9')
pour réussir à lancer le restant de type VARCHAR résultats pour INT
OriginalL'auteur user3867061