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 は違います...