Upload
meiji-kimura
View
1.259
Download
0
Embed Size (px)
Citation preview
3
第7章 NULLとの戦い
• 7.1 NULL
– リスト7.3 値にNULLが含まれる場合
– リスト7.4 リスト7.3を正しく書き換えた例
• 7.2 NULL対策
• 7.3 まとめ
SELECT * FROM users WHERE age <>20
SELECT * FROM users WHERE age <>20 OR age IS NULL
6
NULLセーフな比較演算
• 二つの項目を比較する際に、それぞれの項目にNULLがあるかないによって演算子を使い分けるのはなかなか面倒なものです。たとえばA と Bを比較しようとして、BがNULLで、A IS NULLとするのか、BがNULLでないときにA = Bとするのか、というものです。
• 一部のRDBMSにはNULLを含めた比較演算子が実装されています。たとえばMySQLでは<=>という独自の演算子にてA, B どちらにNULLが含まれても、正しく比較することができます。
8
SQL標準
• SQL標準ではNULL込みの比較がおこなえるIS NOT DISTINCT FROMが定められました。次のように利用します。
• A IS NOT DISTINCT FROM B
• 現時点ではIBM DB2, Firebird, PostgreSQL,
Sybaseで利用できます。
10
実装の闇
• 古くからあるRDBMSではNULLの扱いが特殊な場合があります。
• 具体的には特定のデータ型、比較演算子でNULLの扱いが違う、というものです。
• 有名なものはOracleとMicrosoft SQL
Server/Sybaseに関するものです。
11
OracleのVARCHAR2型
• Oracleでは可変長文字列型カラム型にVARCHAR2を利用しその空文字(長さ0の文字)がNULL扱いされる。
• Oracleで仕事をする人には常識なのですが、Oracleのみ(もしくはOracle互換をうたうDB
の互換モードのみ)の特別な仕様です。
• SQLの入門テキストのみでこの業界に入った人や、Oracleへの移行、Oracleからの移行の場合にはご注意ください。
12
SQL Server/Sybaseの「=NULL」
• MS SQL Server/Sybaseの古いバージョンでは= NULLの表記で正しく(?) 比較できる。
• 古いバージョンやSET ANSI_NULLSオプションがOFFにできるバージョンでは= NULL
がTRUEやFALSEを返します。
• 最近のデフォルトはANSI_NULLSオプションがONつまり= NULLはNULLですので、新規開発では問題がないのですが、過去のバージョンからのバージョンアップや、他のデータベースの移行の際には注意が必要です。
13
リスト7.4の書き換え(MySQL)
• SELECT * FROM users WHERE age <>
20 OR age IS NULL;
• SELECT * FROM users WHERE !(age
<=> 20);
14
リスト7.4の書き換え(SQL標準)
• SELECT * FROM users WHERE age <>
20 OR age IS NULL;
• SELECT * FROM users WHERE age IS
DISTINCT FROM 20;
15
リスト7.4の書き換え(Oracle10以降)
• SELECT * FROM users WHERE age <>
20 OR age IS NULL;
• SELECT * FROM users WHERE LNNVL(age = 20);
16
宣伝1:読書会
• 7shiさん、 furandon_pigさん主催で隔週水曜日にゆるゆるとやってます。
– http://riron-db.connpass.com/
–次回は2015/10/14(水) 20:00より。
• 今回のネタは読書会で話したもの+αです。
–そもそものネタは次の書籍でボツったもの+αです。。。。
宣伝2: 書籍情報
• おうちで学べるデータベースのきほん
–まったくの初心者はこちらをどうぞ。
–増刷出来(パチパチ)
• 入手方法
– じゃんけんで勝つ。
– もしくは、Amazonでポチる w。
• こんな疑問にも答えている(?)
– Read Uncommitted なぜある
17