« Excel&VBA | Main | ソースコード »

2004.04.12

SQL関数(2)

 SQL関数をうまく使うと、今まで「大量にデータを取得してJavaプログラムで処理」していたことを、「DBサーバでうまく処理してJavaプログラムで受け取るデータを必要最小限に」することができそうな感じ?
 ということで、今回は「CHAR型フィールドにおいて、文字列中の半角スペースおよび全角スペースを取り除いた状態で比較を行う」ための支援関数の作成に挑戦してみました。両端の半角スペースならTRIM()関数でサクッと処理できるのですが、"A B"を"AB"と同一視して比較ってのは、どうも標準で実装されている関数だけでは無理っぽいようで。

 まず悩んだのが、引数および戻り値の型指定。JavaのStringクラスなんかだと、文字長は不定なので、特に意識する必要がないのですが、SQLにおいては、CHARもVARCHARも文字数の定義が必要。文字数を指定せずにCHARとだけ記述した場合は、「CHAR(1)」として処理されてしまいました(笑)。しかたがないので、とりあえず今回の用途で「これだけの文字長があれば大丈夫だろう」ということでVARCHAR(100)で定義することに(CHAR(100)で定義するとうまく動かなかったのが不思議ではありますが)。

 アルゴリズムとして、
 1.引数の文字列を1文字ずつ切り取って、半角or全角スペース以外の場合に戻り値に連結。
 2.引数の文字列に対して半角or全角スペースを検索し、そこまでの文字列を戻り地に連結。それ以降の文字列に対して再度半角or全角スペースを検索して文字列を連結していくという処理の繰り返し。
 ってのが思い浮かんだので、とりあえず両方作ってパフォーマンスを比べてみたところ・・・2.の方が2〜2.5倍ほど速い感じでありました。

 不思議だったのが、1.の処理の際に「半角スペース」のみを処理すると全角スペースも取り除けたこと。DBの文字コードがEBCDICで、IN/OUTの処理があったりとややこしいことになりそうだなぁ・・・と思っていただけに、ちょっと意外。もしかすると、全角スペースの文字コードがEBCDICにおいては半角スペースとかぶったりするのかもしれませんが。
 あと、2.の処理においても、SUBSTRで文字列を切り出す際、全角スペースの次の文字から取り出す場合も、全角スペースの文字位置+1で処理できたのも? Javaなら「文字数単位」での処理なので全然不思議ではないのですが、DB2の場合はバイト単位だったような??

|

« Excel&VBA | Main | ソースコード »

DB」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/3959/432546

Listed below are links to weblogs that reference SQL関数(2):

« Excel&VBA | Main | ソースコード »