OI有一个带有约1000万条记录的Teradata表,该表将数字ID字段存储为VARCHAR。我需要将该字段中的值传输到另一个表中的一个bigint列,但是我不能简单地说cast(id_field as 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个可能的字符,则可以使查询不可读。我如何在不单独检查每个字符的非数字字符的情况下过滤在该字段中具有值的行的行?

示例值将是

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

这些值没有特定的模式,我只需要过滤出包含任何非数字数据的模式即可。 123456789还可以,但123.ABC_C3865不是...

有帮助吗?

解决方案

我管理的最好的是:

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

由于高案例字符对较低的案例的十六进制值不同,因此这将确保您没有字母顺序的字符,但仍然会让您遇到下划线,结肠等。如果这不符合您的要求,则可能需要编写UDF。

其他提示

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

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

但是最简单的方法是to_number,它返回零数据以获取不良数据:

TO_NUMBER(col)

我们还可以尝试将字段中的值除以一些整数。涉及...

我遇到了同样的问题,试图将Alpha角色排除在街道地址房屋的数字之外。如果您不介意将所有数字编号置在一起,以下内容将工作……它检查字符串的鞋面是否等于字符串的下部,如果是的,则是一个数字,如果不是数字,则会变为null。

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) 

尝试使用此代码段

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

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

CHAR2HEXINT(upper(id_field))= char2hexint(powers(id_field)) ('1'至'9')和substr(id_field,1,1)

成功地将剩余的VARCHAR结果施加到INT

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top