• ベストアンサー

ACCESS:Nullの扱い

次のようなSQLがあります。 SELECT 住所.住所, 住所.備考 FROM 住所 WHERE (((住所.住所) Not Like "*佐賀県*")); 住所のフィールドにNullがありますが抽出されません。 WHERE (((住所.住所) Not Like "*佐賀県*")) OR (((住所.住所) Is Null)); とすると思い通りの結果になるのですが、なぜNullは「"佐賀県"を含まない」には含まれないのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8514/19356)
回答No.1

>なぜNullは「"佐賀県"を含まない」には含まれないのでしょうか。 通常「佐賀県を含まない」は「佐賀県を含まない、Nullでない有効なデータ」を意味します。 何故なら「佐賀県を含む」は「佐賀県を含む、Nullでない有効なデータ」を意味するからです。 プログラミング初心者がつまづく「0とnull」の違いを分かりやすく説明した画像がこちらです https://togetter.com/li/1083212 上記の例で言えば「佐賀県を含まない」は「ペーパーフォルダーにトイレットペーパーが装着されているが、そのトイレットペーパーはネピアじゃない」になりますし「佐賀県を含む」は「ペーパーフォルダーにトイレットペーパーが装着されているが、そのトイレットペーパーはネピア」になります。一方「Nullの物を含む」は「ペーパーフォルダーにトイレットペーパーが装着されていない」になります。 「佐賀県を含む」は、言い換えれば「ネピアのトイレットペーパーが装着されている」です。 その逆の「佐賀県を含まない」は「ネピアのトイレットペーパーが装着されていない」ではなく「ネピアじゃないトイレットペーパーが装着されている」になります。 どちらも「ともかく、何らかのトイレットペーパーが装着されていること」が前提になります。つまり、どちらの場合も「Nullじゃない」のが前提です。 「ネピアのトイレットペーパーが装着されていない」を検索する場合は「ネピアじゃないトイレットペーパーが装着されているか、または、トイレットペーパーが装着されていない状態」を検索しないとなりません。 つまり WHERE (((住所.住所) Not Like "*佐賀県*")) OR (((住所.住所) Is Null)); じゃないといけないのです。

ticktak
質問者

お礼

とてもわかりやすい解説大変ありがとうございました。

その他の回答 (1)

  • IDii24
  • ベストアンサー率24% (1597/6506)
回答No.2

タイトルに佐賀県を含まない事ですから、タイトルがあることが前提ですよね。別にSQLでなくても文章的にもそういう意味だとおもいますが?

関連するQ&A

  • WHEREでヌルをスルーしたい

    いつもお世話になっております。 SQL文のワイルドカードについての質問なのですが、 SELECT 項目1 FROM 表 WHERE 項目1 LIKE '%' というSQLがあったとして、私は項目1のレコードがすべて返されるのかと思いました。 しかしこれだと項目1フィールドにNULLが入っている(何もデータが入っていない)場合、それは除かれてしまうようです。 NULLのレコードも含めてクエリを返してくれるような条件はあるのでしょうか?

  • 特定のフィールドにデータが入っている件数を表示したい

    ageというフィールドにデータが入っているものだけを抽出してその件数を表示したいのですが、どのようなsql文を書けばいいでしょうか? ageフィールドは、種別「varchar(255)」、NULL「いいえ」、デフォルト値「空欄」になっています。 $sql = "SELECT COUNT(*) AS cnt FROM table where 'age' is not null;"; これではうまくいきませんでした。ageのデフォルト値をNULLにすれば解決するのでしょうか?

    • ベストアンサー
    • MySQL
  • nullと文字数について

    いつもお世話になっています。 select 項目1 from テーブル where 項目1 is null or length(項目1)>=0 質問1 上記SQLを作成した場合、全レコードが抽出されるのでしょうか? 疑問1 (1)項目1が空白一つの場合、length(項目1)>=0となる? (2)nullと空文字の違いがいまいちわからない。 以上、よろしくお願いします。

  • データベースのワイルドカードは%ではないの?

    アクセスのテーブルに あ い う があり、 SQL文で *********************************************** SELECT テーブル1.フィールド FROM テーブル1 WHERE (((テーブル1.フィールド) Like "%あ%")); *********************************************** としてもエラーにならないけど、「あ」が抽出されません。 *********************************************** SELECT テーブル1.フィールド FROM テーブル1 WHERE (((テーブル1.フィールド) Like "*あ*")); *********************************************** にすると、「あ」が抽出されます。 アクセスなどのデータベースのワイルドカードは%だと思っていたのですが違うのですか?

  • 特定のフィールドにデータが入ってる件数を調べたい

    ageというフィールドにデータが入っている件数を調べたいのですが、どのようなsql文を書けばいいでしょうか。 ageフィールドのNULLは「いいえ」、デフォルト値は「空欄」です。 $sql = "SELECT COUNT(*) AS cnt FROM table where 'age' is not null ;"; この文ではうまくいきませんでした。ageフィールドのデフォルト値をNULLにすればいいのでしょうか?

    • ベストアンサー
    • MySQL
  • SQL ?で終わる

    アクセスのSQL文で、テーブルのフィールドの値が、最後が?で終わるものを抽出したいのですが SELECT テーブル.フィールド FROM テーブル WHERE (((テーブル.フィールド) Like "[*?]")); これだと1件も抽出されません。 Like "[*?]"が間違ってると思うのですが、どうすればいいでしょうか?

  • 除外抽出条件

    こんにちは、SQLの抽出条件でわからないところが在るのでよろしくお願いします。 テキスト型でメールアドレスの入ったフィールドに対して抽出をしたいのですが、"@" の含まれていないフィールドの抽出の仕方がわかりません。含まれる場合は select * from テーブル where メールアドレス like '%@%' で出来ます。含まれない場合、 select * from テーブル where メールアドレス <> の後にどう記述すれば言いのでしょうか?

  • AccessのクエリでvbLfのみ抽出するには

    Access2010のクエリー(SQL)で vbLfかvbCrLfが含まれているレコードを抽出するには、 SELECT [テーブル1].* FROM テーブル1 WHERE [テーブル1].フィールド1 Like "*" & Chr(10) & "*"; vbLfが含まれているレコードは抽出せず、 vbCrLfが含まれているレコードだけを抽出するには、 SELECT [テーブル1].* FROM テーブル1 WHERE [テーブル1].フィールド1 Like "*" & Chr(13) & Chr(10) & "*"; でよいと思いますが、 vbCrLfが含まれているレコードは抽出せず、 vbLfが含まれているレコードだけを抽出するには、 どのように記述すればよいのでしょうか。 よろしくお願いします。

  • 【初歩】 SELECT文で意図した照会結果が得られない。NULLの扱いは?

    var1 var2 ------------- abc  null ------------- abc  null ------------- abc  null ------------- のようになっているテーブルに対して、 (1) select * from mytable where var1 = 'abc' (2) select * from mytable where var1 = 'abc' and var2 is null などとやれば、3件全部照会できますが、 (3) select * from mytable where var1 = 'abc' and var2 != '1' (4) select * from mytable where var1 = 'abc' and var2 != 1 とやっても1件も出てこないのですが、なぜでしょうか? 「NULLだって1ではない」わけだから、3件照会できてくれないと 困るのですが・・・

    • ベストアンサー
    • MySQL
  • is null のandについて(日付型)

    SQLのSELECTで困っています。 プロシージャに引数を渡してSELECTしようと考えています。 複数の日付(datetime)型の引数をand条件で結びたいです。 検索したくない場合はnullを渡す。 例) select A,B,C from XXX where A = '1' and (B = 引数 or 引数 is null) and (C = 引数 or 引数 is null) and (D = 引数 or 引数 is null) ===== B,C,D はdatetimeです。 この形ですと、B,C,D全ての引数に日付が入っていれば取得できる のですが一箇所でも引数に何もセットしないと値0件で帰ってきて しまいます。 せっかく(is null)を使用しているのに意味がありません。 良いお知恵は無いでしょうか。 よろしくお願いします。

専門家に質問してみよう