Blackfish SQL での null=null と null is null を考えてみる

CodeGear の Blackfish SQL に限らず、データベースの NULL 値はいろいろと面倒事をはらみやすいですね。
null=null と null is null の違いなども、その一つでして、システムに組み込んだ際に一度はまったので、メモしておきます。

*

まず、= と is の違いについてです。
検証環境は全部 Blackfish SQL です。

null=null の評価は false
null is null の評価は true です。

次の様な SQL で調べれば良いでしょう。

SELECT * FROM [テーブル名] WHERE NULL=NULL
SELECT * FROM [テーブル名] WHERE NULL IS NULL

後者であれば、テーブル内の全てのデータが表示されますね。

で、これの何が問題に発展するのかというと、例えば ASP.NET Web フォームを作り、検索用の値が NULL で入ってしまう場合です。

ConvertEmptyStringToNull が false であっても、null と DBNull が違っちゃったりすると面倒なんですね。

どんな SQL かと言うと、次の様な場合です。

SELECT * FROM [テーブル名]
WHERE
  [カラム]=
    CASE [パラメータ値]
      WHEN NULL THEN [カラム]
      ELSE [パラメータ値]
    END

渡された「パラメータの値」が「NULL」だった場合、「[カラム]=[カラム]」が条件となり、テーブル全てのデータが取得されます。

渡された「パラメータの値」が「何かしらの値」だった場合、「[カラム]=[パラメータ値]」が条件となり、条件にマッチしたデータが取得されます。

つまり、検索機能などの実装に使えるわけですね。
この方式は、SQL Server などでは基本的に有効です。

しかし、Blackfish SQL では、null=null は false ですので、「パラメータの値」が「NULL」の場合、データは取得されないことになります。

そこで、Blackfish SQL の関数を利用し、次の様な SQL を書くことで、本来求めた動きを実装することにしました。

SELECT * FROM [テーブル名]
WHERE
  {FN IFNULL([カラム], -1)}=
    CASE {FN IFNULL([パラメータ値], -1)}
      WHEN -1 THEN {FN IFNULL([カラム], -1)}
      ELSE [パラメータ値]
    END

「カラム」の値に入ることは無い値(例では-1)に NULL を変換し、NULL 値の代わりに使うわけです。

データベースの仕様は様々ですので、今回はこういう対処をしてみました。

Blackfish SQL の情報は少ないのが残念です。

このトピックとちょっと被った・・

10年集客し続けられるサイトを、ワードプレスで自作する9つのポイント プレゼント

【最後まで読んでくれたあなたに】

あなたは、24時間365日、自分の代わりに集客し続けてくれるWebサイトを作りたい!と思ったことはありませんか?

私はこれまで500以上のWebサイトの構築と運営のご相談に乗ってきましたが、Webサイトを作ってもうまく集客できない人には、ある一つの特徴があります。

それは、「先を見越してサイトを構築していないこと」です。
Webサイトで集客するためには、構築ではなく「どう運用するか」が重要です。

しかし、重要なポイントを知らずにサイトを自分で構築したり、業者に頼んで作ってもらってしまうと、あとから全く集客に向いていないサイトになっていたということがよく起こります。

そこで今回、期間限定で
『10年集客し続けられるサイトをワードプレスで自作する9つのポイント』
について、過去に相談に乗ってきた具体的な失敗事例と成功事例を元にしてお伝えします。

・ワードプレスを使いこなせるコツを知りたい!
・自分にピッタリのサーバーを撰びたい!
・無料ブログとの違いを知りたい!
・あとで悔しくならない初期設定をしておきたい!
・プラグイン選びの方法を知っておきたい!
・SEO対策をワードプレスで行うポイントを知りたい!
・自分でデザインできる方法を知りたい!

という方は今すぐ無料でダウンロードしてください。

期間限定で、無料公開しています。

※登録後に表示される利用条件に沿ってご利用ください

コメントを残す