我有一个teradata表,其中有大约1000万条记录,它将数字id字段存储为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,ugly array of non-numeric chars*/) etc,etc...
演员会工作,但从长远来看这是不可行的.它很慢,如果字符串有18个可能的字符,它会使查询不可读.如何在不使用非数字字符数组单独检查每个字符的情况下过滤掉在此字段中具有值而不会作为bigint转换的行?
示例值将是
123abc464 a2.3v65 a_356087 ........ 000000000 BOB KNIGHT 1235468099
值不遵循特定的模式,我只需要过滤掉包含任何非数字数据的值.
123456789没问题,但123.abc_c3865不是……
解决方法
我曾经管理的最好的是:
where char2hexint(upper(id_field)) = char2hexint(lower(id_field))
由于大写字符为小写字母赋予不同的十六进制值,这将确保您没有字母字符,但仍会留下下划线,冒号等.如果这不符合您的要求,您可能需要编写UDF.