
Oracle SQLチューニング(第25回)「NULL処理構文の理解と効率的なSQLの作成」(1/7回)
今回から、「NULL処理構文の理解と効率的なSQLの作成」と題しまして、7回シリーズでお話しさせていただきます。第一回は、概要と「NULL処理関数の理解」というテーマでお届けします。それでは、始めましょう。
NULLとは、列に値が存在しないことを意味します。 NOT NULL制約またはPrimary Key制約がかかっていない列にはNULLデータを含めることができます。 NULLは値自体が存在しないもので、他の値と演算を行うと、誤った結果が抽出される危険があります。たとえば、NULL + 100 = NULLになるので、NULL値を持つ列のデータと操作するときは常に注意する必要があります
このようなNULLデータを持つ列が式演算に正常に使われるためには、NULLデータを任意の値(例えば0)に変更して処理するようにしてくれれば、誤った式演算は避けることができるのです。この場合、NULLデータを式演算に活用できるようにサポートする関数がNVLです。ここで、NVLは式演算とNULL値を文字列に変換することもでき、使用用途が多様です。ただし、NVLを誤って使用する場合は、SQLが効率的ではない方法で実行される可能性があるため、NVLを乱用しないでください。
もしそうなら、NULLを含むSQLの適切な解釈と効率的に処理するNVLの使い方をテストを通して調べましょう。
まず、テストを実行できるようにテストスクリプトを実行しましょう。
Script. NULL処理構文関連テスト用
< NULL_T >
■テーブル生成
■各カラムにインデックス生成および統計情報収集
< NULL_T1 >
■テーブル生成
■各カラムにインデックス生成および統計情報収集
< NULL_T2 >
■テーブル生成
■各カラムにインデックス生成および統計情報収集
< NULL_T3 >
■テーブル生成
■各カラムにインデックス生成および統計情報収集
< NULL_T5 >
■テーブル生成
■データ入力
■各カラムにインデックス生成および統計情報収集
< NOT_NULL_T1 >
■テーブル生成
■データ入力
■各カラムにインデックス生成および統計情報収集
< NOT_NULL_T2 >
■テーブル生成
■データ入力
■各カラムにインデックス生成および統計情報収集
■テーブル生成
■データ入力
7.1 NULL処理関数の理解
7.1.1 NVL ()
Syntax : NVL ( expr1, expr2 )
- NVLは、NULL値を他の値に置き換えるための関数です。
- expr1がNULLの場合はexpr2を返し、expr1がNOT NULLの場合はexpr1を返します。
- expr1とexpr2は複数のデータ型を持つことができますが、異なるデータ型がある場合はexpr1のデータ型に戻ります。
使用例
DATEデータ タイプ
OSのnls_langはAMERICAN_AM
ERICA.AL32UTF8と設定される。
設定変更例)set nls_lang=AMERICAN_AMERICA.AL32UTF8
CHARACTERデータ タイプ
NUMBERデータ タイプ
7.1.2 NVL2 ()
Syntax : NVL2 (expr1, expr2, expr3)
- NVL2 は、expr1 列のデータが NULL または NOT NULL かどうかに応じて異なる値を抽出したい場合に使用される関数です。
- NVL2を通じて抽出されるデータは下記のとおりです。
- expr1 -> NOT NULL -> Return: expr2
- expr1 -> NULL -> Return: expr3
- NVL は expr1 列の NULL であるデータのみ expr2 に置き換え、NOT NULL の場合は expr1 列のデータ自体を照会しますが、NVL2 は expr1 列が NOT NULL であっても列のデータではなく特定の値に置き換えることができます。この理由により多方面で活用が可能です。
- expr2とexpr3のデータ型は、LONGデータ型を除くすべてのデータ型が可能です。
- expr2とexpr3のデータ タイプが違う場合にはexpr2によってデータ タイプが決定されることになるのでデータ タイプは下記のとおりとなります。
- expr2 (CHAR) vs. expr3 (CHAR) -> CHAR
- expr2 (CHAR) vs. expr3 (NUMBER) -> CHAR
- expr2 (NUMBER) vs. expr3 (NUMBER) -> NUMBER
- expr2(NUMBER) vs. expr3(CHAR) -> ERROR(expr3 が '100' 型を除く)
使用例
いかがでしたでしょうか?次回(2/7)は、「NVLの活用」と題してお送りします。では、See You ^^