[Oracle] 大文字/小文字、全角/半角を区別しない文字列比較 (1) | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

大文字/小文字を区別しない文字列比較
UPPER、LOWER、NLS_UPPER、NLS_LOWERといった関数を使って大文字/小文字変換してから比較することで実現できます。

SELECT VALUE FROM T1 WHERE UPPER(VALUE) = 'A';

VALUE
------
a
A

全角/半角を区別しない文字列比較
TO_MULTI_BYTE、TO_SINGLE_BYTEといった関数を使って全角/半角変換してから比較することで実現できます。

SELECT VALUE FROM T1 WHERE TO_MULTI_BYTE(VALUE) = 'A';

VALUE
------
A
A

ただし、TO_MULTI_BYTE、TO_SINGLE_BYTEは正確には全角/半角変換ではなくシングルバイト/マルチバイト変換ですので、キャラクタ・セットによっては全角/半角変換が思ったように動作しないこともあります。

AL16UTF16の環境ではすべての文字がマルチバイトで表されるので全角/半角変換が全く効かないようです。

また、AL32UTF8の環境で試してみると以下のようにカナや一部の記号がうまく変換できませんでした。

SELECT VALUE, TO_MULTI_BYTE(VALUE) MULTIBYTE_VALUE, TO_SINGLE_BYTE(VALUE) SINGLEBYTE_VALUE FROM T1;

VALUE  MULTIBYTE_VALUE  SINGLEBYTE_VALUE
------ ---------------- -----------------
a      a               a
A      A               A
a     a               a
A     A               A
1      1               1
1     1               1
ア      ア                ア                ※全角変換不可
ア     ア               ア               ※半角変換不可
あ     あ               あ               ※半角変換不可
!      ?               !                ※全角変換不可
!     !               !               ※半角変換不可
"      ”               "
”     ”               "
#      #               #
#     #               #
$      $               $
$     $               $
%      %               %
%     %               %
&      ?               &                ※全角変換不可
&     &               &               ※半角変換不可

これではちょっと使えませんよね^^;


大文字/小文字、全角/半角を区別しない文字列比較
UPPER、LOWER、NLS_UPPER、NLS_LOWERといった関数とTO_MULTI_BYTE、TO_SINGLE_BYTEといった関数を組み合わせて変換してから比較することで実現できます。

SELECT VALUE FROM T1 WHERE TO_MULTI_BYTE(UPPER(VALUE)) = 'A';

VALUE
------
A
a
A
a

ただし、やはりキャラクタ・セットによっては全角/半角変換がうまく動作しないということに変わりはありません。


また、こういった関数を使った比較を行うとパフォーマンスが若干悪化するのも気になるところです。

あまり気易く使いたくはないですね。