2011-10-13 39 views
1

我在Oracle中有一行代碼,必須將其轉換爲Teradata。 的Oracle查詢是有人可以在sql或teradata中對我進行驗證

/* 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的理解。

回答

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數據開發的Exchange包含Oracle函數庫,已轉換爲Teradata的UDF的那可能會幫助你解決這個問題。通過一點努力,你可以在C函數中編寫你自己的UDF。 (isdigit

它現在可能沒有幫助,但最近宣佈的Teradata 14.0功能之一是支持正則表達式。

編輯:用REGEXP_INSTR增補TD 14例如應該解決的問題

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