Gestione dei valori NULL di MySQL

Abbiamo visto l'SQL SELECT comando insieme al WHERE clausola per recuperare i dati da una tabella MySQL, ma quando proviamo a dare una condizione, che confronta il campo o il valore della colonna con NULL, non funziona correttamente.

Per gestire una situazione del genere, MySQL fornisce tre operatori:

  • IS NULL - Questo operatore restituisce true, se il valore della colonna è NULL.

  • IS NOT NULL - Questo operatore restituisce true, se il valore della colonna non è NULL.

  • <=> - Questo operatore confronta i valori, che (a differenza dell'operatore =) è vero anche per due valori NULL.

Le condizioni che coinvolgono NULL sono speciali. Non puoi usare =NULL o! = NULLper cercare valori NULL nelle colonne. Tali confronti falliscono sempre perché è impossibile dire se sono veri o meno. A volte, anche NULL = NULL fallisce.

Per cercare colonne che sono o non sono NULL, utilizzare IS NULL o IS NOT NULL.

Utilizzo di valori NULL al prompt dei comandi

Supponiamo che ci sia una tabella chiamata tcount_tbl nel database TUTORIALS e contiene due colonne vale a dire tutorial_author e tutorial_count, dove un tutorial_count NULL indica che il valore è sconosciuto.

Esempio

Prova i seguenti esempi:

root@host# mysql -u root -p password;
Enter password:*******

mysql> use TUTORIALS;
Database changed

mysql> create table tcount_tbl
   -> (
   -> tutorial_author varchar(40) NOT NULL,
   -> tutorial_count  INT
   -> );
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO tcount_tbl
   -> (tutorial_author, tutorial_count) values ('mahran', 20);

mysql> INSERT INTO tcount_tbl
   -> (tutorial_author, tutorial_count) values ('mahnaz', NULL);

mysql> INSERT INTO tcount_tbl
   -> (tutorial_author, tutorial_count) values ('Jen', NULL);

mysql> INSERT INTO tcount_tbl
   -> (tutorial_author, tutorial_count) values ('Gill', 20);

mysql> SELECT * from tcount_tbl;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
|     mahran      |       20       |
|     mahnaz      |      NULL      |
|      Jen        |      NULL      |
|     Gill        |       20       |
+-----------------+----------------+
4 rows in set (0.00 sec)

mysql>

Puoi vedere che = e != non funzionano con i valori NULL come segue -

mysql> SELECT * FROM tcount_tbl WHERE tutorial_count = NULL;
Empty set (0.00 sec)

mysql> SELECT * FROM tcount_tbl WHERE tutorial_count != NULL;
Empty set (0.01 sec)

Per trovare i record in cui la colonna tutorial_count è o non è NULL, le query devono essere scritte come mostrato nel programma seguente.

mysql> SELECT * FROM tcount_tbl 
   -> WHERE tutorial_count IS NULL;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
|     mahnaz      |      NULL      |
|      Jen        |      NULL      |
+-----------------+----------------+
2 rows in set (0.00 sec)
mysql> SELECT * from tcount_tbl 
   -> WHERE tutorial_count IS NOT NULL;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
|     mahran      |       20       |
|     Gill        |       20       |
+-----------------+----------------+
2 rows in set (0.00 sec)

Gestione dei valori NULL in uno script PHP

Puoi usare il file if...else condizione per preparare una query in base al valore NULL.

Esempio

L'esempio seguente utilizza tutorial_count dall'esterno e poi lo confronta con il valore disponibile nella tabella.

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   if( isset($tutorial_count )) {
      $sql = 'SELECT tutorial_author, tutorial_count
         FROM  tcount_tbl
         WHERE tutorial_count = $tutorial_count';
   } else {
      $sql = 'SELECT tutorial_author, tutorial_count
         FROM  tcount_tbl
         WHERE tutorial_count IS $tutorial_count';
   }

   mysql_select_db('TUTORIALS');
   $retval = mysql_query( $sql, $conn );
   
   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Author:{$row['tutorial_author']}  <br> ".
         "Count: {$row['tutorial_count']} <br> ".
         "--------------------------------<br>";
   } 
   echo "Fetched data successfully\n";
   mysql_close($conn);
?>