MySQLi - Manejo de valores NULL

Hemos visto SQL SELECT comando junto con WHERE cláusula para obtener datos de la tabla MySQLi, pero cuando intentamos dar una condición, que compara el valor de campo o columna con NULL, no funciona correctamente.

Para manejar tal situación, MySQLi proporciona tres operadores

  • IS NULL - el operador devuelve verdadero si el valor de la columna es NULL.

  • IS NOT NULL - el operador devuelve verdadero si el valor de la columna no es NULL.

  • <=> - el operador compara valores, que (a diferencia del operador =) es verdadero incluso para dos valores NULL.

Las condiciones que involucran NULL son especiales. No puede usar = NULL o! = NULL para buscar valores NULL en columnas. Estas comparaciones siempre fallan porque es imposible saber si son ciertas o no. Incluso NULL = NULL falla.

Para buscar columnas que sean o no NULL, use IS NULL o IS NOT NULL.

Usando valores NULL en el símbolo del sistema

Supongamos una mesa tutorials_bks en la base de datos de TUTORIALES y contiene dos columnas id y name, donde un nombre NULL indica que el valor es desconocido -

Ejemplo

Pruebe los siguientes ejemplos:

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

mysql> use TUTORIALS;
Database changed

mysql> INSERT INTO tutorials_bks (book) values('');
Query OK, 1 row affected (0.08 sec)

mysql> INSERT INTO tutorials_bks (book) values('');
Query OK, 1 row affected (0.08 sec)

mysql> INSERT INTO tutorials_bks (book) values('');
Query OK, 1 row affected (0.08 sec)

mysql> INSERT INTO tutorials_bks (book) values('NULL');
Query OK, 1 row affected (0.08 sec)

mysql> INSERT INTO tutorials_bks (book) values('NULL');
Query OK, 1 row affected (0.08 sec)

mysql> INSERT INTO tutorials_bks (book) values('NULL');
Query OK, 1 row affected (0.08 sec)

+----+---------+
| id | book    |
+----+---------+
|  1 | java    |
|  2 | java    |
|  3 | html    |
|  4 | c++     |
|  5 | Android |
|  6 |         |
|  7 |         |
|  8 |         |
|  9 | NULL    |
| 10 | NULL    |
| 11 | NULL    |
+----+---------+
11 rows in set (0.00 sec)

mysql>

Para encontrar registros donde la columna de nombre es o no NULL, las consultas deben escribirse así:

mysql> SELECT * FROM tutorials_bks WHERE book = "null";
+----+------+
| id | book |
+----+------+
|  9 | NULL |
| 10 | NULL |
| 11 | NULL |
+----+------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM tutorials_bks WHERE book ! = "null";
+----+---------+
| id | book    |
+----+---------+
|  1 | java    |
|  2 | java    |
|  3 | html    |
|  4 | c++     |
|  5 | Android |
|  6 |         |
|  7 |         |
|  8 |         |
+----+---------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM tutorials_bks WHERE book = "";
+----+------+
| id | book |
+----+------+
|  6 |      |
|  7 |      |
|  8 |      |
+----+------+
3 rows in set (0.01 sec)

Manejo de valores NULL en script PHP

Puede utilizar la condición if ... else para preparar una consulta basada en el valor NULL.

Ejemplo

El siguiente ejemplo toma tutorial_count del exterior y luego lo compara con el valor disponible en la tabla.

<?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);
?>