6

o 数値 ID フィールドを varchar として格納する、約 1,000 万件のレコードを含む teradata テーブルがあります。このフィールドの値を別のテーブルの bigint 列に転送する必要がありますが、無効な文字エラーが発生するため、単純にキャスト (id_field as bigint) とは言えません。値を調べると、文字列の任意の位置に文字が存在する可能性があることがわかりました。そのため、文字列が varchar(18) であるとしましょう。次のように無効な行を除外できます。

     where substr(id_field,1,1) not in (/*big,ugly array of non-numeric chars*/)
     and substr(id_field,2,1) not in (/*big,ugly array of non-numeric chars*/)

etc, etc... 

その後、キャストは機能しますが、これは長期的には実現可能ではありません。これは遅く、文字列に 18 文字の文字が含まれていると、クエリが読めなくなります。非数値文字の配列について各文字を個別にチェックせずに bigint としてキャストされないこのフィールドの値を持つ行を除外するにはどうすればよいですか?

例の値は次のようになります

   123abc464
   a2.3v65
   a_356087
   ........
   000000000
   BOB KNIGHT
   1235468099

値は特定のパターンに従っていません。数値以外のデータを含むものを除外するだけです。123456789 は大丈夫ですが、123.abc_c3865 は違います...

4

8 に答える 8

6

私が今まで管理した中で最高のものはこれです:

where char2hexint(upper(id_field)) = char2hexint(lower(id_field))

大文字は小文字とは異なる16進値を与えるため、アルファベット文字がないことを保証しますが、アンダースコアやコロンなどは残ります。これが要件を満たしていない場合は、UDFを作成する必要があります。

于 2010-08-26T07:39:29.417 に答える
0

フィールドの値を整数で除算することもできますか?関与...

于 2011-04-05T10:43:48.427 に答える
0

このコード セグメントを使用してみてください

WHERE id_Field NOT LIKE '%[^0-9]%'
于 2014-11-03T23:48:20.783 に答える
0

私は同じ問題に直面して、番地の番地からアルファベット文字を除外しようとしました。すべての数値を連結してもかまわない場合は、次のように動作します。文字列の上部が文字列の下部と等しいかどうかを確認し、そうであれば数値であり、そうでない場合は null になります。

select cast(case when upper(substring('12E'from 1 for 1)) = lower(substring('12E'from 1 for 1)) then substring('12E'from 1 for 1) else null end ||
             case when upper(substring('12E'from 2 for 1)) = lower(substring('12E'from 2 for 1)) then substring('12E'from 2 for 1) else null end ||
             case when upper(substring('12E'from 3 for 1)) = lower(substring('12E'from 3 for 1)) then substring('12E'from 3 for 1) else null end ||
             case when upper(substring('12E'from 4 for 1)) = lower(substring('12E'from 4 for 1)) then substring('12E'from 4 for 1) else null end ||
             case when upper(substring('12E'from 5 for 1)) = lower(substring('12E'from 5 for 1)) then substring('12E'from 5 for 1) else null end ||
             case when upper(substring('12E'from 2 for 1)) = lower(substring('12E'from 2 for 1)) then substring('12E'from 2 for 1) else null end
             as integer) 
于 2012-08-28T01:16:19.093 に答える