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

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

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

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

こんにちは、EightyEightRiceです。

 

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

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

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

「へぇーそうなんだ」

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

 

今回は

 

CHARとVARCHAR2【ORACLEの場合】PART5

 

です。

 

前回はCHAR同士のSQLの等式での考え方を解説をしました。

今回は「VARCHAR2同士のSQLの等式」についてさらに深堀していこうと思います。

 

前回の「CHAR同士のSQLの等式」おさらいとして、

再度、CHAR同士の比較ルールを言葉でいうと、

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

という事になります。

 つまり、以下はすべてTRUEなんですね。

・'A  ' = 'A          ' ➡ 'A          ' = 'A          '

・'ABC   ' = 'ABC' ➡ 'ABC   ' = 'ABC   '

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

 

 今回は、VARCHAR2同士の比較です。

先に VARCHAR2同士の比較ルールを言葉でいうと、

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

となります。

 

VARCHAR2型の変数やカラムに値を格納する場合のルールを見てみましょう。

以下、以前の記事の引用です。

==============================

るカラムの型が

VARCHAR2(5 BYTE)であった場合、

 

"A" → "A"

"あいう" → "あいう"

"A___" → "A___"  (後ろの空白もそのまま)

 

と、そのまま登録されます。

 

見えやすく、「 _ 」を使いましたが、実際は半角スペースで埋められます。 

==============================

  

これが、VARCHAR2の値の保持、データの持ち方のルールでした。

つまり、後ろの空白は、

”あえて意味を持たせて登録されている”

という事が読み取れますね。

<VARCHAR2型同士の比較ルール>

VARCHAR2型の変数やカラム同士を比較する場合は、

空白の有無に関わらず、保持している値同士を、そのまま比較する。

 

以下に、TRUEの場合とFALSEの場合のSQLの等式を示します。

 (両辺がVARCHAR2とします。)

・'ABC' = 'ABC'    (TRUE)

・'A          ' = 'A          '  (TRUE)

・'ABC   ' = 'ABC'   (FALSE)

・'   ' = '          '     (FALSE)

 

ただし、CHAR同士の場合と同様に、

以下、FALSEになるので、注意が必要です。

・'' = '' ➡ NULL = NULL

 

最後に、CHARとVARCHAR2の比較ルールはどうでしょうか。

これは、VARCHAR2同士の比較ルールが適用されます。

 

以上、解説でした。

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

こんにちは、EightyEightRiceです。

 

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

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

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

「へぇーそうなんだ」

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

 

今回は

 

CHARとVARCHAR2【ORACLEの場合】PART4

 

です。

 

前回までで、

・NULL

・空文字

・TRIM()

 

を紹介し、SQLの等式での考え方を解説をしました。

今回は「SQLの等式」についてさらに深堀していこうと思います。

 

以前、記事「CHARとVARCHAR2【ORACLEの場合】PART1」で、

・CHAR    = 固定長

・VARCHAR2   = 可変長

というお話をしましたが、これをSQLの等式では、どう扱えばいいのか、

考えていきましょう。

 

まず、等式での評価(同じか同じでないかの判定)が、特殊なのがCHARです。

おさらいとして、

CHAR型の変数やカラムに値を格納する場合のルールを見てみましょう。

以下、以前の記事の引用です。

==============================

あるカラムの型が

CHAR(5 BYTE)

あった場合、どんな文字や単語を登録しても、5BYTEになります。

(ここで、半角英数は1BYTEBYTE、ひらがなは1BYTEとします。)

どのように登録されるかというと、以下のようになります。

"A" → "A____"

"あいう" → "あいう____"

 見えやすく、「 _ 」を使いましたが、実際は半角スペースで埋められます。

==============================

 

これが、CHARの値の保持、データの持ち方のルールでした。

 それを踏まえた上で、CHAR型同士の等式評価のルールも考えましょう。

以下のようなSQLの等式は、TRUEでしょうか、FALSEでしょうか。

 

・'A' = 'A    '

(左辺がCHAR(1)、右辺がCHAR(5)とします。)

 

実は、この結果は、TRUEと評価されます。

これを理解する為に、以下の比較ルールが必要です。

<CHAR型同士の比較ルール>

CHAR型の変数やカラム同士を比較する場合は、

定義されている長さの大きいほうと同じ長さになるまで、

長さの小さい変数の後ろに半角スペースを付け足してから比較する

 

つまり、先ほどの等式は以下の様に評価します。

==============================

・'A' = 'A    ' ➡ 'A    ' = 'A    '

(左辺がCHAR(1)、右辺がCHAR(5)とします。)

==============================

 左辺が1BYTE、右辺が5BYTEのCHARなので、

左辺の'A'の後ろに4つ半角スペースを付け足します。

 

したがって、TRUEと評価されるわけです。

以下のようなパターンもすべてTRUEと評価されます。

・'A  ' = 'A          ' ➡ 'A          ' = 'A          '

・'ABC   ' = 'ABC' ➡ 'ABC   ' = 'ABC   '

 

ただし、

・'' = '' ➡ NULL = NULL

でFALSEになるので、注意が必要ですね。 

 

言葉でまとめると、

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

という事になります。

 

以上、解説でした。

関連記事

記事一覧

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

こんにちは、EightyEightRiceです。

 

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

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

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

「へぇーそうなんだ」

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

 

今回は

 

CHARとVARCHAR2【ORACLEの場合】PART3

 

です。

 

前回で

・NULL

・空文字

 の解説をしました。これを踏まえた上で、今回は

・TRIM

の解説をして、「NULL」「空文字」との関係を掴んでいければ、

と思います。

 

「TRIM」は、SQLやPLSQLにおいて、標準で定義されている関数です。

SQLやPLSQL以外でも標準関数として定義している言語も多いです。

 

どんな処理を行う関数かと、

「引数で与えられた文字列に対し、

前後の半角スペース・全角スペースを取り除いたものを戻り値として返す」

関数です。

具体的な例として、

・TRIM('ABC   ')        => 'ABC'

・TRIM('   ABC')        => 'ABC'

・TRIM('   ABC  ') => 'ABC'

・TRIM('ABC')           => 'ABC'

となります。

基本的な考え方としては、上記のルールは分かればOKです。

 

ここで前回のSQLの等式と絡めて、初心者がつまずく点を解説しておきます。

 

以下の場合、戻り値はどうなるでしょうか。

・TRIM('   ') => ??

 

直観的には、「''」になりそうですね。

しかし、実際には前回解説しましたが、ORACLEに空文字「''」は無く、

すべてNULLになります。

 

つまり、

・TRIM('   ') => NULL

が正解です。

 

ここで、次のSQLの等式を考えてみましょう。

・TRIM('   ') = TRIM('   ')

 この等式の結果は、TRUEでしょうか、FALSEしょうか。

 左辺右辺がまったく同じ値なので、TRUEになりそうですね。

しかし、正解はFALSEです。

 

なぜかというと、先ほど解説しましたが、

・TRIM('    ')

は、NULLになります。

ORACLEでは空文字('')はすべてNULLだからですね。

したがって、

上記等式は、

・TRIM('    ') = TRIM('    ') ➡ '' = '' ➡ NULL = NULL

つまり、FALSEとなります。

 「NULL = NULL」がFALSEになる理由は前回解説していますので、

気になる方はチェックしてみてください。

 

以上、解説でした。

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

こんにちは、EightyEightRiceです。

 

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

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

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

「へぇーそうなんだ」

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

 

今回は

 

CHARとVARCHAR2【ORACLEの場合】PART2

 

です。

 

前回でざっくりまずのイメージは掴めたと思います。

 今回はさらに理解が深まるように、丁寧に解説していきます。

 

まず、準備として以下の2つの用語の使い方を解説します。

・NULL

・空文字

 

「NULL」は、データベースでは"値がない"という状態を表す為に用います。

しかし、これはよくわかりませんね。

値がないというのは形式的な言い方で、

感覚的には"比較不能"、くだけた言い方では"比べられない"という意味で覚えて良いと思います。

さらにかみ砕いて言うと、"比べられない"というのは、

SQLの等式・不等式がすべてFALSEになるという事です。

以下、すべてFALSEです。

 'ABC'  =  NULL
   0   >=  NULL
   0   <   NULL
 NULL   =  NULL

最後のパターンは初心者がよく間違えてしまいます。

NULLとNULLで同じなのでTRUEのように見えますが、

もちろん、NULLとNULLも比べられず、結果はFALSEになります。

 

「空文字」とは、プログラミングではよく聞く用語ですが、長さが0の文字列と考えて良いでしょう。

シングルクォーテーション(")で文字列を表す場合、

「''」が空文字です。

「'」と「'」の間に何もないですね。これが空文字です。

と、解説しましたが、実はORACLEに空文字は存在しません。

ORACLEで「''」と書いた場合、NULLとして扱われます。

 

 以上を踏まえたうえで、以下の等式はFALSEになります。

'' = ''

なぜかというと、

空文字('')はORACLEではNULLなので、上記等式は、

・'' = '' ➡ NULL = NULL

つまり、FALSEとなります。

 

以上、解説でした。

関連記事

記事一覧

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

こんにちは、EightyEightRiceです。

 

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

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

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

「へぇーそうなんだ」

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

 

今回は

 

CHARとVARCHAR2【ORACLEの場合】PART1

 

です。

 

まず、SQLの教育でならうのは、

CHAR    → 固定長

VARCHAR2 → 可変長

ですね。

教育係の方は、教科書に書いてある事を強調して教えてくれますが、

あいまいな用語を、よくわからない用語で言い換えても

初学者や初心者は、いきなりモチベーションが下がってしまいますね。

 

まずは、厳密な定義は知らなくてよいので、

固定長と可変長の意味を考えてみましょう。

両方とも語尾に"長"がついているので、長さについての用語のようですね。

 

それぞれについて、仮に下記のように定義しましょう。

「定義する」というのは、雰囲気で、こう決めましょうくらいの気持ちです。

 

可変長(仮)変える事が可能な長さ

固定長(仮)変える事ができない長さ

 

このように決めておきます。

違いがあると、何が嬉しいの?

なんで固定長と可変長があると何がいいの?という考えが浮かぶと思います。

プログラミングの世界では、固定長・可変長に様々なメリット・デメリットがあります。

ここでは、DBを扱う際のメリット・デメリットを主観で挙げておきます。

□固定長

「いつも長さが同じだから、計算がしやすい

一方で、

「いつも長さが同じだから、少ない情報量の割りにデータ保存に場所をとる」

 

□可変長

「長さが変えられるから、データ保存する場所は、情報量に対して必要最低限でOK

一方で、

「長さが変えられるから、計算がしづらい」

 

話がやや逸れましたが、CHAR・VARCHAR2の定義も仮決めできます。

 

CHAR(仮)          変える事ができない長さの型

VARCHAR2(仮)変える事が可能な長さの型

 

具体的には、

あるカラムの型が

CHAR(5 BYTE)

あった場合、どんな文字や単語を登録しても、5BYTEになります。

(ここで、半角英数は1BYTE、ひらがなは1BYTEとします。)

どのように登録されるかというと、以下のようになります。

 

"A" → "A____"

"あいう" → "あいう____"

 

 見えやすく、「 _ 」を使いましたが、実際は半角スペースで埋められます

 

一方、VARCHAR2(5 BYTE)

 

"A" → "A"

"あいう" → "あいう"

"A___" → "A___"  (後ろの空白もそのまま)

 

 と、そのまま登録されます。

 

以上、解説でした。

関連記事

記事一覧

【在庫管理システムとデータベース】その4・実績

こんにちは、EightyEightRiceです。

 

今日の記事は、【在庫管理システムとデータベース】です。

物流業界のシステム(WMS:Warehouse Management System)におけるデータベースの扱い方・考え方を解説しています。

今回は

その4・実績

です。

 

以前、【在庫管理システムとデータベース】その2・予定と実績を解説し、

WMSでデータベースを扱う際の、一番基本の考え方と言いました。

「予定」に続き、今回は実績に予定との関係を考えながら、掘り下げてみます。

 

以下、解説です。

実績とは

WMSの根幹の考え方で、事実を記録していくデータを「実績」と呼びます。

具体的に入荷業務を考えてみましょう。

入荷業務のざっくりとした流れは、

 

荷主様からEDIを受信

入荷予定を作成

入荷検品

入荷確定

 

上記のなかで、入荷検品処理のタイミングで、入荷実績が作成されます。

現場の作業の様子はというと、

入荷予定リストを持って、

搬送されたアイテムが保管されている場所へ行く

HHTで入荷検品処理を行う

入荷したアイテムを適切なロケーションへ移動する

といった形です。

この時、予定に対して、アイテムの数量に過不足がある場合は、実績テーブルや予定テーブルに差異があった事を記録します。

 

以上、実績の解説でした。

関連記事

記事一覧