6
votes

Comment filtrer les valeurs non numériques dans un champ de texte de Teradata?

OI a une table Teradata avec environ 10 millions d'enregistrements, qui stocke un champ d'identification numérique en tant que Varchar. J'ai besoin de transférer les valeurs dans ce champ sur une colonne de Bigint dans une autre table, mais je ne peux pas simplement dire à la distribution (id_field comme Bigint) car je reçois une erreur de caractère invalide. En regardant à travers les valeurs, je trouve qu'il pourrait y avoir un caractère à n'importe quelle position de la chaîne, disons donc que la chaîne est Varchar (18), je pourrais filtrer des lignes non valides comme: xxx

Ensuite, la distribution fonctionnerait, mais cela n'est pas réalisable à long terme. C'est lent et si la chaîne a 18 caractères possibles, il rend la requête illisible. Comment filtrer les lignes qui ont une valeur dans ce champ qui ne coule pas comme une Bigint sans vérifier chaque caractère individuellement pour un tableau de caractères non numériques?

Exemple de valeurs serait < Pré> xxx

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


1 commentaires

S'il vous plaît fournir quelques exemples. Voulez-vous dire que vous avez des données comme ceci? 123ABC456 Ensuite, appelez-vous le champ IT numérique?


8 Réponses :


6
votes

Le meilleur que j'ai jamais géré est celui-ci:

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


3 commentaires

Je dois malheureusement traiter avec des personnages spéciaux. Qu'est-ce qu'un UDF?


Fonction définie par l'utilisateur, écrite en C. Il y en a un pour vérifier les grossications à développeur.teradata.com/blog/madmac/2010/03/...


Mise à jour de lien: Télécharger.Teradata.com / blog / madmac / 2010/03 / ...



0
votes

Pourrions-nous aussi essayer de diviser les valeurs sur le terrain par certains entier "si divisé doit alors être un nombre et si non et jette une erreur, il doit alors avoir du caractère ..." Devinez ce serait beaucoup plus vite comme vient de mathématiques impliquées ...


1 commentaires

Le problème avec cette approche est que Teradata ne vous dit pas quelles lignes ont les caractères sur cette défaillance. il dit juste qu'il y a un échec. Comment trouvez-vous la ligne spécifique afin que vous puissiez résoudre le problème?



0
votes

J'ai fait face au même problème pour essayer d'exclure les caractères alpha des numéros de maison d'adresses de rue. Ce qui suit fonctionnera si cela ne vous dérange pas de concatacher tous les numéros numériques ensemble ...... Il vérifie si la partie supérieure d'une chaîne est égale à la baisse de la chaîne, si c'est donc un nombre, sinon cela devient null. xxx


1 commentaires

C'est une solution similaire à la réponse acceptée. Mais le même problème reste toujours. Comment gérez-vous des caractères spéciaux?



0
votes

Essayez d'utiliser ce segment de code

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


2 commentaires

Teradata ne fait pas le traitement des regex. Du moins pas la mise en œuvre que j'étais à l'époque. Cela aurait certainement rendu les choses beaucoup plus faciles.


TD14 a ajouté certaines fonctions basées sur une expression régulière: où regexp_similar (id_field, '[0-9]') = 1 , avant TD14, il pourrait y avoir otranslate: où otranslate ('ID_Field', ' 0123456789 '', '') = ''



0
votes

J'ai trouvé Lins314159 Réponse Pour être très utile avec un problème similaire. C'est peut-être un vieux fil mais pour ce que ça vaut la peine, j'ai utilisé:

Char2hexint (UPTR (ID_Field)) = Char2Hexint (Basse (ID_Field)) et SUBSTR (ID_Field, 1,1) dans ('1' à '9')

Pour lancer avec succès les résultats de Varcharate restants vers INT


0 commentaires

8
votes

commençant par TD14 Teradata a ajouté certaines fonctions, il existe maintenant plusieurs façons, par exemple: xxx pré>

mais le moyen le plus simple est to_number, qui retourne null pour des données mauvaises: P>

TO_NUMBER(col)


0 commentaires

0
votes
SELECT customer_id
FROM t
WHERE UPPER(customer_id)(CASESPECIFIC) <>
      LOWER(customer_id)(CASESPECIFIC);
This works perfectly fine to check whether the values in a numeric field is non-numeric.

1 commentaires

Non, cela ne fonctionne que pour les caractères où les majuscules / minuscules existent: essayez 1 <23 ou 1ß23



0
votes
SELECT id_field
WHERE oTranslate(id_field, '0123456789','')<>'';
This works well for me! It reveals any id_field containing a non-numeric value

0 commentaires