有人可以在sql或teradata中为我验证这一点

时间:2011-10-13 15:09:30

标签: sql regex oracle10g teradata plsqldeveloper

我在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

该列定义为VARCHAR(20),但我只想选择数据全部为数字的行。我无法验证Teradata查询,因为它是一个非常长时间运行的查询,我无权访问创建表,或者我无法验证我拥有的数据库的输出。我有些尝试了,看起来它有效,但我曾经想验证语法和我对REGEXP_INSTR的理解。

1 个答案:

答案 0 :(得分: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。 (isdigit

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

编辑:添加了应该解决问题的REGEXP_INSTR的TD 14示例

SELECT table.column
  FROM table
WHERE REGEXP_INSTR(table.column, '[^[digit]])') = 0;