1

我在 Oracle 中有一行代码,我必须将其转换为 Teradata。Oracle 查询是

 /* add to avoid invalid number due to junk in column */

AND regexp_instr(table.column, ''[^[:digit:]]'', 1, 1)  = 0 

我用 Teradata 编写的代码

AND (CASE WHEN (POSITION('' '' IN TRIM(table.column)) > 0) OR (UPPER(TRIM(table.column))              
        (CASESPECIFIC) <> LOWER(TRIM(table.column)) (CASESPECIFIC)) 
          THEN 1 ELSE 0 end ) = 0

该列被定义为 aVARCHAR(20)但我只想选择数据都是数字的行。我无法验证 Teradata 查询,因为它是一个运行时间很长的查询,而且我无权创建表,或者我无法验证我拥有的数据库上的输出。我有些尝试过,它看起来很有效,但我曾经想验证语法和我对 REGEXP_INSTR 的理解。

4

1 回答 1

0

如果我阅读正确并根据我的测试,这将打破你的逻辑(都返回 1):

SELECT (CASE WHEN (POSITION('' '' IN TRIM('1234')) > 0) OR (UPPER(TRIM('1234'))              
        (CASESPECIFIC) <> LOWER(TRIM('1234')) (CASESPECIFIC)) 
          THEN 1 ELSE 0 END )

SELECT (CASE WHEN (POSITION('' '' IN TRIM('abcd ef1')) > 0) OR (UPPER(TRIM('abcd ef1'))              
        (CASESPECIFIC) <> LOWER(TRIM('abcd ef1')) (CASESPECIFIC)) 
          THEN 1 ELSE 0 END )

Teradata Developer's Exchange 包含已转换为 Teradata UDF 的 Oracle 函数库,可帮助您解决此问题。isdigit()稍加努力,您就可以围绕C 函数编写自己的 UDF 。(是数字

现在可能没有用,但最近宣布的 Teradata 14.0 功能之一是支持正则表达式。

编辑:使用 REGEXP_INSTR 添加了 TD 14 示例,应该可以解决问题

SELECT table.column
  FROM table
WHERE REGEXP_INSTR(table.column, '[^[digit]])') = 0;
于 2011-10-13T23:53:06.950 回答