1

Oracle にコード行があり、それを 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 の理解を確認したいと思っていました。

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には、この問題に対処するのに役立つ可能性のあるTeradataUDFに変換されたOracle関数のライブラリが含まれています。isdigit()少しの努力で、 C関数の周りに独自のUDFを書くことができます。(isdigit

今は役に立たないかもしれませんが、最近発表されたTeradata 14.0の機能の1つは、正規表現のサポートです。

編集:問題を解決するはずのREGEXP_INSTRを使用したTD14の例を追加しました

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