Как отфильтровать нечисловые значения в текстовом поле в Teradata? - PullRequest
6 голосов
/ 24 августа 2010

o У меня есть таблица teradata с около 10 миллионами записей, в которой поле числового идентификатора хранится как varchar.мне нужно перенести значения в этом поле в столбец bigint в другой таблице, но я не могу просто сказать cast (id_field как bigint), потому что я получаю ошибку недопустимого символа.Просматривая значения, я обнаружил, что в любой позиции строки может быть символ, поэтому предположим, что строка varchar (18). Я могу отфильтровать недопустимые строки следующим образом:

     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... 

, затемлитье будет работать, но в долгосрочной перспективе это невозможно.он медленный, и если строка содержит 18 возможных символов, запрос становится нечитаемым.Как я могу отфильтровать строки, которые имеют значение в этом поле, которое не будет приведено как bigint без проверки каждого символа в отдельности для массива нечисловых символов?

примерные значения будут

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

значения не следуют конкретным шаблонам, мне просто нужно отфильтровать те, которые содержат ЛЮБЫЕ нечисловые данные.123456789 это хорошо, но 123.abc_c3865 не ...

Ответы [ 6 ]

6 голосов
/ 26 августа 2010

Лучшее, с чем я когда-либо справлялся, это:

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

Так как символы верхнего регистра дают разное шестнадцатеричное значение, чем символы нижнего регистра, это гарантирует, что у вас нет алфавитных символов, но все равно будетоставить вас с подчеркиванием, двоеточиями и так далее.Если это не соответствует вашим требованиям, вам может потребоваться написать UDF.

3 голосов
/ 19 августа 2015

Начиная с TD14 Teradata добавлены некоторые функции, теперь есть несколько способов, например ::

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

Но самый простой способ - TO_NUMBER, который возвращает NULL для неверных данных:

TO_NUMBER(col)
0 голосов
/ 19 августа 2015

Я нашел ответ lins314159, который очень помог с подобной проблемой.Это может быть старый поток, но для чего он стоит, я использовал:

char2hexint (верхний (id_field)) = char2hexint (нижний (id_field)) AND substr (id_field, 1,1) IN ('1' до '9')

для успешного приведения оставшихся результатов VARCHAR к INT

0 голосов
/ 04 ноября 2014

Попробуйте использовать этот сегмент кода

WHERE id_Field NOT LIKE '%[^0-9]%'
0 голосов
/ 28 августа 2012

Я столкнулся с той же проблемой, пытаясь исключить буквенные символы из номеров домов. Следующее сработает, если вы не возражаете объединить все числовые числа вместе ...... Он проверяет, равна ли верхняя часть строки нижнему значению строки, если это так, то это число, если нет, то становится нулевым.

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) 
0 голосов
/ 05 апреля 2011

могли бы мы также попытаться разделить значения в поле на некоторое целое число: «если разделить, то должно быть число, а если нет, то выдает некоторую ошибку, то должно иметь какой-то символ ....», думаю, это будет очень быстро, так кактолько математика вовлечена ...

...