Teradataのテキストフィールドで非数値を除外するにはどうすればよいですか?
質問
oiには、約1,000万のレコードが含まれているTeradataテーブルがあり、数値IDフィールドをVarcharとして保存します。このフィールドの値を別のテーブルのBigint列に転送する必要がありますが、無効な文字エラーが発生しているため、Cast(ID_Fieldとして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個のキャラクターがある場合、クエリを読み取り不可能にします。このフィールドに値がある行をフィルタリングするには、各文字を個別にチェックせずに非数字の文字を個別にチェックせずにキャストしない行を除外するにはどうすればよいですか?
値の例は次のとおりです
123abc464
a2.3v65
a_356087
........
000000000
BOB KNIGHT
1235468099
値は特定のパターンに従いません。単純なパターンを含むパターンを除外する必要があります。 123456789は大丈夫ですが、123.ABC_C3865は...
解決
私が今まで管理した中で最も良いのはこれです:
where char2hexint(upper(id_field)) = char2hexint(lower(id_field))
大文字のキャラクターは小文字とは異なる16進価値を与えているため、アルファベット順のキャラクターがないことが保証されますが、アンダースコア、コロンなどが残ります。これが要件を満たしていない場合は、UDFを書く必要がある場合があります。
他のヒント
TD14 Teradataから始めて、いくつかの機能を追加しましたが、現在、複数の方法があります。
WHERE RTRIM(col, '0123456789') = ''
しかし、最も簡単な方法はto_numberです。これは、悪いデータのためにnullを返します。
TO_NUMBER(col)
また、フィールドの値を整数で分割しようとしますか?「分割する場合は数字であり、そうでない場合はエラーをスローする必要があります。関与...
私は同じ問題に直面して、Alphaの文字を路上住所の家番号から除外しようとします。すべての数値を一緒に連結することを気にしない場合は、次のことが機能します......文字列の上部が文字列の下部に等しいかどうかをチェックします。
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)
このコードセグメントを使用してみてください
WHERE id_Field NOT LIKE '%[^0-9]%'
Lins314159の答えは、同様の問題に非常に役立つことがわかりました。それは古いスレッドかもしれませんが、それが価値があることのために、私は使用しました:
char2hexint(upper(id_field))= char2hexint(lower(id_field)) およびsubstr(id_field、1,1)in( '1'〜 '9')
残りのvarchar結果をintに正常にキャストします