MySQLで空のフィールドを確認する


100

私は、特定の基準でユーザーをチェックするクエリを作成しました。

私たちのサイトでは、ユーザーがメールアドレスを持っていても持っていなくてもかまいません。

$aUsers=$this->readToArray('
 SELECT `userID` 
 FROM `users` 
 WHERE `userID` 
 IN(SELECT `userID`
         FROM `users_indvSettings`
  WHERE `indvSettingID`=5 AND `optionID`='.$time.')
  AND `email`!=""
 ');

これは、SQLで空のフィールドを確認する最良の方法ですか?私は「IS NOT NULL」を試したところ、メールアドレスがなくてもユーザーレコードが返されました。

上記のクエリは機能しますが、好奇心から、私はそれを正しい方法で行っているのかと思いました。

php  sql  mysql  null 

回答:


274

空のフィールドは、空の文字列またはのいずれかNULLです。

両方を処理するには、以下を使用します。

email > ''

rangeテーブルに空の電子メールレコード(両方のタイプ)がたくさんある場合は、アクセスのメリットがあります。


11
これの逆は何ですか?(NULLまたは ''フィールドのみが必要な場合)
Keylan

1
@Keylan:単一の式はありません。
Quassnoi

5
@Keylan:!(メール> '')
SEoF

3
@SEoF:これは一致しませんNULL
Quassnoi

2
Quassnoiと同じコメントがあります。「select orig_id、hotline from normal_1952 where!(hotline> '')」を発行し、ホットラインがnullのレコードが1つありますが、一致しません。MySQL5.6を使用しています
Scott Chu

38

はい、あなたがやっていることは正しいです。メールフィールドが空の文字列でないことを確認しています。NULLはデータが欠落していることを意味します。空の文字列""は、長さが0 の空の文字列です。

nullチェックも追加できます

AND (email != "" OR email IS NOT NULL)

1
式は空の文字列にも一致します。OR email IS NOT NULLここでは冗長です(これは前の条件で暗示されています)。
クアスノイ

1
興味深いことに、これはまだ空のemailフィールドを持つレコードを返します。

13
ORはANDである必要があります。0の長さの空メールの文字列にマッチします「または電子メールはNULLではありません」
pdavis

pdavisのコメント "OR SHOULD BE AND"に注意してください
初心者


2

空の文字列(email!= "")とNULLの間には違いがあります。NULLはnullであり、空の文字列は何かです。


AND(email!= "" OR email IS NOT NULL)が失敗するのはなぜですか?

3
あるべきAND (email != '' AND email IS NOT NULL)
thetaiko

@thetaiko:email IS NOT NULLここでは冗長です。!=述語がNULL値と一致することはありません。
Quassnoi、2010

試した場合:AND(trim(email)!= '')
Leslie

私はこの議論にかなり遅れていることを知っていますが、順序を逆にするとステートメントは機能します:「AND((email IS NOT NULL)AND(email!= ''))。他の順序で評価された場合、電子メールアドレスがNULLの場合、ステートメントはnull(TRUEではない)と評価されるため、TRUEまたはFALSEにはなりません。したがって、IS NULLチェックは最初に行わなければなりません!
カート2013

2

これは機能しますが、nullレコードが返される可能性があります。レコードを挿入するときに電子メールアドレスを長さゼロの文字列に設定している場合でも、システムにNULLの電子メールアドレスが侵入した場合に対処する必要がある場合があります。

     $aUsers=$this->readToArray('
     SELECT `userID` 
     FROM `users` 
     WHERE `userID` 
     IN(SELECT `userID`
               FROM `users_indvSettings`
               WHERE `indvSettingID`=5 AND `optionID`='.$time.')
     AND `email` != "" AND `email` IS NOT NULL
     ');

@opのクエリでは、NULLレコードが返される可能性はありません。
Quassnoi、2010


-3

このコードで問題を確認してください:

$sql = "SELECT * FROM tablename WHERE condition";

$res = mysql_query($sql);

while ($row = mysql_fetch_assoc($res)) {

    foreach($row as $key => $field) {  

        echo "<br>";

        if(empty($row[$key])){

            echo $key." : empty field :"."<br>"; 

        }else{

        echo $key." =" . $field."<br>";     

        }
    }
}

すべての行をループする必要なしに、クエリでこれを行うより良い方法があります
Jiho Kang
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.