Oracle PL/SQL非数値文字のフィルタ


背景:同僚にレポートを作成し、EXCEL、Webページなどからクエリー条件(ローカル)をレポートにコピーします.
ユーザーはデータが見つからないことを反映している--調査後、ユーザーが記入した局編にスペースがあることを発見した--TRIMを手当たり次第に追加した.
また、データが見つからない場合もあります.全角スペースが付いています.全角スペースをReplaceで置き換えます.
また調べられず、改行やEXCELの謎の空白文字などが混ざっている可能性もある.
処理:最初の反応は、ユーザーに貼り付ける前に手帳にコピーし、無効な文字をフィルタすることです.簡単で、効果的ですが、とても友好的ではありません.
解决:お问い合わせの后、合理的な局编は数字だけで构成されていることがわかり、数字以外の文字を安心してフィルタリングすることができます.(注:10 g以降はregex_replaceで簡単に実現できます.)
このOracleにはtranslate(a,b,c)関数があります.
  • a,b,cの3つのパラメータはいずれも文字列
  • である
  • a,b,cのいずれかがNULLである場合、NULLが返される.
  • そうでなければ、a中の各文字xについて、b中で検索:見つからない場合は、xを戻り値に追加し、見つかった場合は、cから対応する位置の文字y(例えばxがbに現れ、6番目の文字であれば、cからも6番目の文字を取り、cが6文字未満であればyがNULL)yがNULLでない場合は、yを戻り値に追加yがNULLの場合、x
  • を無視
    数字以外の文字が多すぎて、一つ一つリストすることはできません.したがって、2つのステップに分けられます.まず、非デジタル文字fをフィルタします.
    select translate('a1e2c3z', '#0123456789', '#') from dual;
    

    その後、fをフィルタ列としてもう一度フィルタリングすると、純粋な数字列(0接頭辞をつなぎ合わせて空でないことを保証し、NULLを返さない)が得られ、組み合わせることができる.
    select translate( 'a1e2c3z', '0' || translate('a1e2c3z', '#0123456789', '#'), '0') from dual;