Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

NULLとの戦い RDBMS実装編

1,693 views

Published on

2015-10-08(木)に行われた理論から学ぶデータベース実装入門Nightで行ったLightning Talkのスライドです。

Published in: Internet
  • Be the first to comment

NULLとの戦い RDBMS実装編

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

×