2017/12/07
ORACLEの文字列を格納するデータ型には、CHARとVARCHAR2があることを以前に紹介しましたが、この2つの型は比較時の動作が少し異なることをご存知でしょうか。
特にCHAR型の空白埋め比較セマンティクスには注意が必要です。
本記事ではそのあたりのことについて解説していきます。
sponsored link
文字型の比較方法
空白埋め比較セマンティクス
文字型の検索方法の1つ目は、空白埋め比較セマンティクスです。
空白埋め比較セマンティクスは、比較対象の文字長が少ない方の文字列の後ろに半角スペースを補ってから、比較を行う検索方法です。
比較する文字列の双方が、CHAR型・文字列リテラルの場合に採用される検索方法です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
-- CHAR型とCHAR型の比較 -- 項目aはCHAR(5)、項目bはCHAR(3) SELECT a ,b ,CASE WHEN a = b THEN 0 ELSE 1 END comp FROM test_table ; -- 検索結果(半角スペースは【_】、NULLは【NULL】と表現) A B COMP ----- --- ---- 1____ 1__ 0 __2__ __2 0 3____ __3 1 __4__ 4__ 1 ____5 __5 1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
-- CHAR型と文字列リテラルの比較 -- 項目aはCHAR(5) SELECT a ,CASE WHEN a = '1' THEN 0 ELSE 1 END comp FROM test_table ; -- 検索結果(半角スペースは【_】、NULLは【NULL】と表現) A COMP ----- ---- 1____ 0 __1__ 1 ____1 1 |
非空白埋め比較セマンティクス
文字型の検索方法の2つ目は、非空白埋め比較セマンティクスです。
非空白埋め比較セマンティクスは、そのままの値で比較を行う検索方法です。
比較する文字列の片方または双方が、VARCHAR2型の場合に採用される検索方法です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
-- VARCHAR2型とVARCHAR2型の比較 -- 項目aはVARCHAR2(5)、項目bはVARCHAR2(5) SELECT a ,b ,CASE WHEN a = b THEN 0 ELSE 1 END comp FROM test_table ; -- 検索結果(半角スペースは【_】、NULLは【NULL】と表現) A B COMP ----- ----- ---- 1 1 0 __2 __2 0 ____3 ____3 0 4____ 4____ 0 5____ 5 1 __6__ __6 1 ____7 7 1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
-- VARCHAR2型とCHAR型の比較 -- 項目aはVARCHAR2(5)、項目bはCHAR(5) SELECT a ,b ,CASE WHEN a = b THEN 0 ELSE 1 END comp FROM test_table ; -- 検索結果(半角スペースは【_】、NULLは【NULL】と表現) A B COMP ----- ----- ---- 1____ 1____ 0 __2__ __2__ 0 ____3 ____3 0 4 4____ 1 __5 __5__ 1 ____6 6____ 1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
-- VARCHAR2型と文字列リテラルの比較 -- 項目aはVARCHAR2(5) SELECT a ,CASE WHEN a = '1' THEN 0 ELSE 1 END comp FROM test_table ; -- 検索結果(半角スペースは【_】、NULLは【NULL】と表現) A COMP ----- ---- 1 0 1____ 1 __1__ 1 ____1 1 |
空白埋め比較セマンティクスの動作仕様に注意
通常、文字列の比較はそのままの値で比較を期待します(非空白埋め比較セマンティクス)。
そのため、後ろに半角スペースを補って文字列長を揃えてから比較する空白埋め比較セマンティクスには注意が必要です。
空白埋め比較セマンティクスでもインデックスは有効
CHAR型でインデックスが張ってある項目が、空白埋め比較セマンティクスで半角スペースが補われた場合、インデックスは効かなくなるのでは懸念しました。
結果としては、問題なくインデックスは有効でした。
まとめ
文字型の比較方法の違いについて見てきました。
空白埋め比較セマンティクスについては、通常期待する文字列の比較とは動作仕様が異なる点から注意が必要です。しかし、あまり知られていないのが現状です。
意図しない動作の原因となるので、ぜひ覚えておきましょう。