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: 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? P> Exemple de valeurs serait p> < Pré> xxx pré> 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 ... p> p>
8 Réponses :
Le meilleur que j'ai jamais géré est celui-ci:
where char2hexint(upper(id_field)) = char2hexint(lower(id_field))
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 à
Mise à jour de lien: Télécharger.Teradata.com / blog / madmac / 2010/03 / ...
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 ... p>
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?
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.
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?
Essayez d'utiliser ce segment de code
WHERE id_Field NOT LIKE '%[^0-9]%'
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 code>, avant TD14, il pourrait y avoir otranslate:
où otranslate ('ID_Field', ' 0123456789 '', '') = '' code>
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é: p>
Char2hexint (UPTR (ID_Field)) = Char2Hexint (Basse (ID_Field)) Pour lancer avec succès les résultats de Varcharate restants vers INT P>
commençant par TD14 Teradata a ajouté certaines fonctions, il existe maintenant plusieurs façons, par exemple: mais le moyen le plus simple est to_number, qui retourne null pour des données mauvaises: P> TO_NUMBER(col)
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.
Non, cela ne fonctionne que pour les caractères où les majuscules / minuscules existent: essayez 1 <23 code> ou
1ß23 code>
SELECT id_field WHERE oTranslate(id_field, '0123456789','')<>''; This works well for me! It reveals any id_field containing a non-numeric value
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?