dal 2015 - visita n. 634
Il valore NULL
Il valore NULL

 

Il valore NULL

Abbiamo visto il funzionamento del comando SELECT con la clausola WHERE per il prelievo dei dati da una tabella MySQL, ma quando una data condizione confronta il valore di un campo con NULL nascono dei problemi.
Per gestire correttamente tale situazione MySQL prevede tre operatori.

Le condizioni che coinvolgono NULL sono particolari. Non è possibile utilizzare "= NULL" oppure "!= NULL" per cercare dei valori NULL nelle colonne. Tali confronti danno sempre esiti sbagliati perché non è impossibile dire se sono veri oppure no. Anche "NULL = NULL" non funziona.

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


Il valore NULL a linea di comando

Supponiamo di avere una tabella dbcount_tbl nel database DBPROVA, che contiene due colonne prova_author e prova_count, dove un valore NULL in prova_count indica che il valore è sconosciuto:

Esempio

# mysql -u root -p password;

Dopo l'inserimento della password di root:

mysql> use DBPROVA;
Database changed
mysql> create table dbcount_tbl
    -> (
    -> prova_author varchar(40) NOT NULL,
    -> prova_count  INT
    -> );
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO dbcount_tbl
    -> (prova_author, prova_count) values ('Martino', 20);
mysql> INSERT INTO dbcount_tbl
    -> (prova_author, prova_count) values ('Mevio', NULL);
mysql> INSERT INTO dbcount_tbl
    -> (prova_author, prova_count) values ('Filano', NULL);
mysql> INSERT INTO dbcount_tbl
    -> (prova_author, prova_count) values ('Sempronio', 15);

mysql> SELECT * from dbcount_tbl;
+-----------------+----------------+
| prova_author    | prova_count    |
+-----------------+----------------+
| Martino         |             20 |
| Mevio           |           NULL |
| Filano          |           NULL |
| Sempronio       |             15 |
+-----------------+----------------+
4 rows in set (0.00 sec)

Si può verificare che gli operatori = e != non funzionano con i valori NULL:

mysql> SELECT * FROM dbcount_tbl WHERE prova_count = NULL;
Empty set (0.00 sec)
mysql> SELECT * FROM dbcount_tbl WHERE prova_count != NULL;
Empty set (0.01 sec)

Per trovare i record dove il valore della colonna prova_count sia o non sia NULL bisogna riscrivere le query come segue:

mysql> SELECT * FROM dbcount_tbl 
    -> WHERE prova_count IS NULL;
+-----------------+----------------+
| prova_author    | prova_count    |
+-----------------+----------------+
| Mevio           |           NULL |
| Filano          |           NULL |
+-----------------+----------------+
2 rows in set (0.00 sec)
mysql> SELECT * from dbcount_tbl 
    -> WHERE prova_count IS NOT NULL;
+-----------------+----------------+
| prova_author    | prova_count    |
+-----------------+----------------+
| Martino         |             20 |
| Sempronio       |             15 |
+-----------------+----------------+
2 rows in set (0.00 sec)

Il valore NULL con script PHP

You can use if...else condition to prepare a query based on NULL value.

Esempio

L'esempio seguente confronta un valore che arriva dall'esterno $prova_count con il valore disponibile nella tabella prova_count. Si noti, infatti, l'uso della condizione isset.

<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
  die('Connessione impossibile. Errore: ' . mysql_error());
}
if( isset($prova_count )) {
   $sql = 'SELECT prova_author, prova_count
           FROM  dbcount_tbl
           WHERE prova_count = $prova_count';
}
else {
   $sql = 'SELECT prova_author, prova_count
           FROM  dbcount_tbl
           WHERE prova_count IS $prova_count';
}

mysql_select_db('DBPROVA');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
  die('Prelievo dei dati impossibile. Errore: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
    echo "Author:{$row['prova_author']}  <br> ".
         "Count: {$row['prova_count']} <br> ".
         "--------------------------------<br>";
} 
echo "Prelievo dei dati riuscito.\n";
mysql_close($conn);
?>

















Introduzione
Installazione
Amministrazione
MySQL e PHP
Gestione database
Tipi di dati
Gestione tabelle
Query insert
Query select
Query update e delete
Clausola where
Clausola like e regexp
Clausola order by
Clausola join
Il valore NULL
Le transazioni
Il comando ALTER
Gli indici
Tabelle temporanee e cloni
Info sul database
Generazione di sequenze
Gestione dei duplicati
Iniezione di codice SQL
Export / Import



Dove tuona un fatto, siatene certi, ha lampeggiato un'idea.
Ippolito Nievo

Valid CSS!
pagina generata in 0.001 secondi