2011-10-13 2 views
1

Oracle에 코드 줄이 있으며 Teradata로 변환해야했습니다. 오라클 쿼리는누가 SQL 또는 Teradata에서 나를 대신 확인할 수 있습니까?

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

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

내가 열이 VARCHAR(20)로 정의되어 있지만 데이터가 모두 숫자이고 난 단지 행을 선택하려는 테라 데이타

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 

에 작성한 코드입니다. Teradata 쿼리는 매우 장기간 실행되는 쿼리이므로 테이블을 만들 수있는 권한이 없거나 데이터베이스에있는 쿼리를 확인할 수 없습니다. 몇 가지 시도하고 그것을 작동하는 것처럼 보이지만 한 번 구문 및 REGEXP_INSTR 내 이해를 확인하려면 싶었어요.

답변

0

나는이 논리를 깰 것입니다 내 테스트를 기반으로 제대로 읽고 있어요 경우 (모두 1을 반환) :

테라 데이타 UDF의 변환 된 테라 데이타 개발자의 Exchange 오라클 함수의 라이브러리를 포함
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) 

그 이 문제를 해결하는 데 도움이 될 수 있습니다. 약간의 노력을 기울여 isdigit() C 함수를 사용하여 직접 UDF를 작성할 수 있습니다. (isdigit)

최근에 발표 된 Teradata 14.0 기능 중 하나는 정규식 지원입니다.

편집 : 문제

SELECT table.column 
    FROM table 
WHERE REGEXP_INSTR(table.column, '[^[digit]])') = 0; 
를 해결해야 REGEXP_INSTR에 추가 TD (14) 예
관련 문제