如何在teradata中的文本字段中过滤掉非数字值?

时间:2010-08-24 18:23:30

标签: sql types filtering teradata

oI有一个teradata表,其中包含大约1000万条记录,它将数字id字段存储为varchar。我需要将此字段中的值传输到另一个表中的bigint列,但我不能简单地说使用强制转换(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不是......

8 个答案:

答案 0 :(得分:6)

我曾经管理过的最好的是:

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

由于大写字符为小写字母赋予不同的十六进制值,这将确保您没有字母字符,但仍会留下下划线,冒号等。如果这不符合您的要求,您可能需要编写UDF。

答案 1 :(得分:3)

从TD14 Teradata开始添加了一些功能,现在有多种方式,例如:

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

但最简单的方法是TO_NUMBER,它为坏数据返回NULL:

TO_NUMBER(col)

答案 2 :(得分:0)

我们还可以尝试将字段中的值除以某个整数“如果除以必须是一个数字,如果没有并抛出一些错误,那么必须有一些字符......”猜测这会很快只涉及数学...

答案 3 :(得分:0)

我遇到了同样的问题,试图从街道地址号码中排除字母字符。如果您不介意将所有数字汇总在一起,以下内容将有效...... 它检查字符串的上部是否等于字符串的下部,如果是,则为数字,否则为空。

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) 

答案 4 :(得分:0)

尝试使用此代码段

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

答案 5 :(得分:0)

我发现lins314159答案对类似问题非常有帮助。它可能是一个旧线程,但对于它的价值,我用过:

char2hexint(upper(id_field))= char2hexint(lower(id_field)) AND substr(id_field,1,1)IN('1'到'9')

成功将剩余的VARCHAR结果转换为INT

答案 6 :(得分:0)

SELECT customer_id
FROM t
WHERE UPPER(customer_id)(CASESPECIFIC) <>
      LOWER(customer_id)(CASESPECIFIC);

这非常适合检查数字字段中的值是否为非数字。

答案 7 :(得分:0)

SELECT id_field
WHERE oTranslate(id_field, '0123456789','')<>'';

这对我来说很好!它会显示任何包含非数字值的id_field