この記事では、Oracle 文字列に数字と特殊記号が含まれる並べ替えの問題を解決する方法を説明します。最近、あるプロジェクトでそのような要求に遭遇しました。それは、特定のコミュニティをコミュニティ、建物、ユニット番号、部屋番号に従って分類する必要があるというものでした。これは SQL ステートメントで解決できる非常に単純な要件のように思えますが、実際にはこのルーチンは非常に奥深いものです。ここでは、Oracle 文字列内の数値と特殊記号のソートの問題について説明します。あなた。
問題の説明:
あるコミュニティをコミュニティ、建物、ユニット番号、部屋番号でソートする必要がありますが、住所の説明でソートすると、文字列に数字が含まれるため、次の結果が発生します。
建物 1 の次は建物 2 であるはずですが、クエリの結果は建物 10 になります。
問題を解いてみます
正規表現を使用して
を置き換えます 結果:
建物番号の並べ替えは正常ですが、部屋番号の並べ替えは混乱していることがわかります。解決策を考え続けます
究極の解決策:
翻訳関数
を使用して、結果が正常に表示されることを確認します。
translateの使い方を以下に添付します
1. 構文:
TRANSLATE(string,from_str,to_str)
TRANSLATE(string,from_str,to_str)
二、目的
返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string。TRANSLATE 是 REPLACE 所提供的功能的一个超集。如果 from_str 比 to_str 长,那么在 from_str 中而不在 to_str 中的额外字符将从 string 中被删除,因为它们没有相应的替换字符。to_str 不能为空。Oracle 将空字符串解释为 NULL,并且如果TRANSLATE 中的任何参数为NULL,那么结果也是 NULL。
三、允许使用的位置
过程性语句和SQL语句。
四、示例
Sql代码
SELECT TRANSLATE('abcdefghij','abcdef','123456') FROM dual; TRANSLATE ( -------------- 123456ghij SELECT TRANSLATE('abcdefghij','abcdefghij','123456') FROM dual; TRANSL ---------- 123456
语法:TRANSLATE(expr,from,to)
expr: 代表一串字符,from 与 to 是从左到右一一对应的关系,如果不能对应,则视为空值。
举例:
select translate('abcbbaadef','ba','#@') from dual (b将被#替代,a将被@替代) select translate('abcbbaadef','bad','#@') from dual (b将被#替代,a将被@替代,d对应的值是空值,将被移走)
因此:结果依次为:@#c##@@def 和@#c##@@ef
语法:TRANSLATE(expr,from,to)
2. 目的
Return (all) from_str 内の各文字は、to_str および後続の文字列内の対応する文字に置き換えられます。 TRANSLATE は、REPLACE によって提供される機能のスーパーセットです。 from_str が to_str より長い場合、from_str にはあるが to_str には含まれていない余分な文字は、対応する置換文字がないため、文字列から削除されます。 to_str を空にすることはできません。 Oracle は空の文字列を NULL として解釈し、TRANSLATE のパラメータが NULL の場合、結果は NULL になります。3. 許可される場所
手続きステートメントと SQL ステートメント。4. 例
SQL コードselect translate('abcbbaadef','ba','#@') from dual (b将被#替代,a将被@替代) select translate('abcbbaadef','bad','#@') from dual (b将被#替代,a将被@替代,d对应的值是空值,将被移走)文法: TR
ANSLATE(expr,from,to)
expr: from と to の文字列を表します。 from 左と右が 1 対 1 に対応しており、対応関係がない場合は null 値とみなされます。 例:
SELECT TRANSLATE('2KRW229','0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','9999999999XXXXXXXXXXXXXXXXXXXXXXXXXX') "License"FROM DUAL
したがって、結果は次のようになります: @#c##@@def および @#c##@@ef
構文: TRANSLATE(expr,from,to) code><br>
SELECT TRANSLATE('2KRW229','0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789') "Translate example"FROM DUALしたがって、結果は次のようになります: @#c##@@def および @#c##@@ef例は次のとおりです:例 1: 数値を 9 に変換する、その他 大文字を X に変換したり、その逆に変換したりします。
SELECT TRANSLATE('我是中国人,我爱中国', '中国', 'China') "Translate example" FROM DUAL
例 2: 数字を保持し、他の大文字を削除します。
SELECT TRANSLATE('I am Chinese, I love China', 'China', '中国') "Translate example" FROM DUAL
例 3: この例は、to_string の文字数が from_string の文字数より多い場合、追加の数がバイト数ではなく文字に従って処理されることを証明します。文字数は重要ではないようで、例外はスローされません。
SELECT TRANSLATE('2KRW229', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', '') "License" FROM DUAL
例 4: 次の例は、from_string の文字数が to_string よりも大きい場合、余分な文字が削除されること、つまり char パラメーターから 3 つの文字 ina が削除されることを証明します。もちろんサイズも書いてあります。
🎜🎜🎜🎜🎜SELECT TRANSLATE('中国人', substr('中国人',1,length('中国人') - 1), rpad('*',length('中国人'),'*')) "License" FROM DUAL🎜🎜🎜例 5: 次の例は、2 番目のパラメーターが空の文字列の場合、関数全体が null を返すことを証明しています。 🎜🎜🎜rrreee🎜🎜🎜 例 6: 銀行振込を行う場合、口座名義人の名前の最後の文字だけが表示され、残りがアスタリスクに置き換えられることがよくあります。これを翻訳を使用して同様のものを作成します。 🎜🎜🎜rrreee🎜🎜🎜そのような問題が発生した場合は、上記の方法を試してください。 🎜🎜🎜関連する推奨事項: 🎜🎜🎜Oracle の Contains 関数の使用法の概要について🎜🎜🎜🎜Oracle ページング クエリの基本原則の詳細な説明🎜🎜🎜🎜Oracle プログラム開発のヒント🎜🎜
以上が数字と特殊記号を含む Oracle 文字列のソート問題を解決するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。