最後に、同僚の助けを借りて、実行可能な解決策にたどり着きました。いくつかの制限があります (符号は考慮されず、小数部分は考慮されません) が、ID の場合は問題なく機能します。
- 文字列の先頭と末尾の両方からスペースを削除
- 文字列から先頭のゼロを削除
- 最大許容長のテスト
- 文字列に 0 を 4 文字まで埋め込む (文字列の先頭に 4 つのゼロを追加し、文字列から最後の 4 文字を取得する)
- 許可された文字のセットで文字列の各位置をテストします
SRC_TABLE
したがって、変換できないレコードはDECIMAL(4)
select で取得できます。
select
Some_Id
from
SRC_TABLE
where
characters(trim(leading '0' from trim(both ' ' from Some_Id))) > 4
or substring(substring('0000' || trim(leading '0' from trim(both ' ' from Some_Id)) FROM characters('0000' || trim(leading '0' from trim(both ' ' from Some_Id))) - 3) FROM 1 FOR 1) NOT IN ('0','1','2','3','4','5','6','7','8','9')
or substring(substring('0000' || trim(leading '0' from trim(both ' ' from Some_Id)) FROM characters('0000' || trim(leading '0' from trim(both ' ' from Some_Id))) - 3) FROM 2 FOR 1) NOT IN ('0','1','2','3','4','5','6','7','8','9')
or substring(substring('0000' || trim(leading '0' from trim(both ' ' from Some_Id)) FROM characters('0000' || trim(leading '0' from trim(both ' ' from Some_Id))) - 3) FROM 3 FOR 1) NOT IN ('0','1','2','3','4','5','6','7','8','9')
or substring(substring('0000' || trim(leading '0' from trim(both ' ' from Some_Id)) FROM characters('0000' || trim(leading '0' from trim(both ' ' from Some_Id))) - 3) FROM 4 FOR 1) NOT IN ('0','1','2','3','4','5','6','7','8','9');
編集:より便利なのは、変換 char から int TeraData Sql への回答で dnoeth が提案した方法で、TD 13.10 でも機能します。
-- TO_NUMBER returns NULL when failing
CAST(TO_NUMBER(UTENTE_CD) AS INTEGER)
-- check if there are only digits
CASE WHEN UTENTE_CD = '' -- all spaces
THEN NULL
WHEN LTRIM(UTENTE_CD, '0123456789') = '' -- only digits
THEN CAST(UTENTE_CD AS INTEGER)
ELSE NULL
END