物流・倉庫・WMS・プログラマ日記

物流・倉庫・WMS・プログラマ日記

在庫管理・倉庫管理を扱う事が多いプログラマの備忘録です。

【SQLを丁寧に理解する】CHARとVARCHAR2【ORACLEの場合】PART6

こんにちは、EightyEightRiceです。

 

今日の記事は、【SQLを丁寧に理解する】CHARとVARCHAR【ORACLE】PART6です。

データベースを扱い場合に、よくハマってしまう項目について、丁寧に説明していきます。

ざっと読み飛ばすだけでも、

「へぇーそうなんだ」

と、思っていただけるような構成を心がけています。

 

今回は

 

CHARとVARCHAR2【ORACLEの場合】PART6

 

です。

 

前回までで、

 

CHAR同士のSQLの等式

「CHAR同士の比較は後ろの空白は無視して比較して良い」

 

VARCHAR2同士のSQLの等式

「VARCHAR2同士の比較は後ろの空白は無視してはいけない」

 

を解説しました。

ちなみにCHARとVARCHAR2の等式は、

VARCHAR2同士の比較ルールが適用されるのでした。

 

今回は応用編です。

関数を絡めた文字列の等式についてさらに深堀していこうと思います。

 

以下のSQLの等式はTRUでしょうか、FALSEでしょうか。

・TRIM('A  ') = 'A          '

(右辺左辺ともにCHAR型としています。)

 

左辺のTRIMは文字列の前後の空白を取り除く関数なので、

・TRIM('A  ') ➡ 'A'

となりますね。

 

すると、最初のSQLの等式は以下のように書き換えられます。

・TRIM('A  ') = 'A          ' ➡ 'A' = 'A          '

したがって、CHAR同士の比較ルール 

「CHAR同士の比較は後ろの空白は無視して比較して良い」

 を適用し、TRUEでしょうか。

 

実はこれは間違いです。なぜでしょうか。

 

理由は簡単です。TRIM()という関数の戻り値の型が、

VARCHAR2なんですね。

つまり、

・TRIM('A  ') = 'A          ' ➡ 'A' = 'A          '

 (左辺 CHAR型、右辺 VARCHAR2型)

 となりますね。

比較しているのは、CHARとVARCHAR2なので、

VARCHAR2同士の比較ルール

「VARCHAR2同士の比較は後ろの空白は無視してはいけない」

 が適用されます。

よって、結果はFALSEとなります。

 

以下に、何パターンかSQLの等式を示します。

 (両辺がCHARとします。)

・TRIM('ABC') = 'ABC'    (TRUE)

・TRIM('ABC      ') = 'ABC'    (TRUE)

・TRIM('A          ') = TRIM('A          ')  (TRUE)

・TRIM('A    ') || ' ' = 'A '  (TRUE)

  

CHAR同士、VARCHAR2同士の比較ルールを理解し、

どのパターンを当てはめるかを意識していきましょう。

 

以上、解説でした。