6

o我有一个 teradata 表,其中包含大约 1000 万条记录,它将数字 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 个可能的字符,它会使查询不可读。如果不单独检查每个字符以查找非数字字符数组,我如何过滤掉该字段中具有不会强制转换为 bigint 的值的行?

示例值是

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

这些值不遵循特定的模式,我只需要过滤掉那些包含任何非数字数据的值。123456789 可以,但 123.abc_c3865 不行...

4

8 回答 8

8

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

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

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

TO_NUMBER(col)
于 2015-08-19T09:43:09.527 回答
6

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

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

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

于 2010-08-26T07:39:29.417 回答
0

我们是否也可以尝试将字段中的值除以某个整数“如果除则必须是一个数字,如果不是并抛出一些错误,则必须有一些字符......”猜猜这会像数学一样快涉及...

于 2011-04-05T10:43:48.427 回答
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) 
于 2012-08-28T01:16:19.093 回答
0

尝试使用此代码段

WHERE id_Field NOT LIKE '%[^0-9]%'
于 2014-11-03T23:48:20.783 回答
0

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

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

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

于 2015-08-19T08:58:48.877 回答
0
SELECT customer_id
FROM t
WHERE UPPER(customer_id)(CASESPECIFIC) <>
      LOWER(customer_id)(CASESPECIFIC);

这可以很好地检查数字字段中的值是否是非数字的。

于 2020-07-22T00:21:12.447 回答
0
SELECT id_field
WHERE oTranslate(id_field, '0123456789','')<>'';

这对我很有效!它显示任何包含非数字值的 id_field

于 2020-10-09T15:05:13.413 回答