MySQLi - Xử lý các giá trị NULL

Chúng tôi đã thấy SQL SELECT lệnh cùng với WHERE mệnh đề để tìm nạp dữ liệu từ bảng MySQLi, nhưng khi chúng tôi cố gắng đưa ra một điều kiện, so sánh giá trị trường hoặc cột với NULL, nó không hoạt động bình thường.

Để xử lý tình huống như vậy MySQLi cung cấp ba toán tử

  • IS NULL - toán tử trả về true nếu giá trị cột là NULL.

  • IS NOT NULL - toán tử trả về true nếu giá trị cột không phải là NULL.

  • <=> - toán tử so sánh các giá trị, (không giống như toán tử =) đúng ngay cả với hai giá trị NULL.

Các điều kiện liên quan đến NULL là đặc biệt. Bạn không thể sử dụng = NULL hoặc! = NULL để tìm kiếm giá trị NULL trong cột. So sánh như vậy luôn luôn thất bại bởi vì không thể biết liệu chúng có đúng hay không. Thậm chí NULL = NULL không thành công.

Để tìm kiếm các cột có hoặc không phải là NULL, hãy sử dụng IS NULL hoặc IS NOT NULL.

Sử dụng giá trị NULL tại Dấu nhắc lệnh

Giả sử một bảng tutorials_bks trong cơ sở dữ liệu TUTORIALS và nó chứa hai cột id name, trong đó tên NULL chỉ ra rằng giá trị là không xác định -

Thí dụ

Hãy thử các ví dụ sau:

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>

Để tìm các bản ghi mà cột tên có hoặc không phải là NULL, các truy vấn phải được viết như thế này:

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)

Xử lý giá trị NULL trong PHP Script

Bạn có thể sử dụng điều kiện if ... else để chuẩn bị truy vấn dựa trên giá trị NULL.

Thí dụ

Ví dụ sau lấy tutorial_count từ bên ngoài và sau đó so sánh nó với giá trị có sẵn trong bảng.

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