MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

SQL NULLIF () Giải thích

Hầu hết các RDBMS chính đều hỗ trợ NULLIF() toán tử trả về NULL nếu cả hai đối số của nó là tương đương. Nếu các đối số không tương đương, NULLIF() trả về đối số đầu tiên.

NULLIF() là một tính năng tiêu chuẩn SQL (nó được bao gồm trong đặc điểm kỹ thuật ISO / IEC 9075).

Cú pháp

Cú pháp như sau:

NULLIF (V1, V2)

Điều này tương đương với CASE sau biểu thức:

CASE WHEN V1=V2 THEN NULL ELSE V1 END

Ví dụ

Dưới đây là một ví dụ để chứng minh:

SELECT NULLIF( 12, 12 );

Kết quả:

NULL

Trong trường hợp này, cả hai đối số đều giống hệt nhau và do đó kết quả là NULL .

Tùy thuộc vào RDBMS của bạn, đầu ra thực tế cho các giá trị NULL có thể khác nhau. Ví dụ:khi sử dụng psql (cho PostgreSQL), chuỗi trống được xuất theo mặc định bất cứ khi nào trả về giá trị NULL (mặc dù điều này có thể được thay đổi). Điều này cũng tương tự với SQLite (và điều này cũng có thể được thay đổi).

Khi các đối số không tương đương

Đây là những gì sẽ xảy ra khi các đối số không tương đương:

SELECT NULLIF( 12, 13 );

Kết quả:

12

Các đối số khác nhau và do đó, đối số đầu tiên được trả về.

Chuỗi

Dưới đây là một ví dụ so sánh các chuỗi:

SELECT 
    NULLIF( 'Gym', 'Gym' ) AS "Same",
    NULLIF( 'Gym', 'Bag' ) AS "Different";

Kết quả:

+------+-----------+
| Same | Different |
+------+-----------+
| NULL | Gym       |
+------+-----------+

Ngày

Dưới đây là một ví dụ so sánh các ngày:

SELECT 
    NULLIF( DATE '2045-11-25', DATE '2045-11-25' ) AS "Same",
    NULLIF( DATE '2045-11-25', DATE '1990-08-15' ) AS "Different";

Kết quả:

+------+------------+
| Same | Different  |
+------+------------+
| NULL | 2045-11-25 |
+------+------------+

Biểu thức

NULLIF() đánh giá giá trị hiện tại của các biểu thức. Do đó, nếu chúng ta truyền một biểu thức như sau:

SELECT NULLIF( 24, 2 * 12 );

Chúng tôi nhận được điều này:

NULL

2 nhân với 12 được 24 và do đó hai đối số là tương đương.

Đây là những gì sẽ xảy ra nếu chúng ta thay đổi đối số thứ hai:

SELECT NULLIF( 24, 3 * 12 );

Kết quả:

24

Đối số đầu tiên được trả về.

Một ví dụ về cơ sở dữ liệu

Giả sử chúng ta chạy truy vấn sau:

SELECT 
    Name,
    LocalName
FROM country 
WHERE Region = 'South America'
ORDER BY Name;

Kết quả:

+------------------+-------------------+
| Name             | LocalName         |
+------------------+-------------------+
| Argentina        | Argentina         |
| Bolivia          | Bolivia           |
| Brazil           | Brasil            |
| Chile            | Chile             |
| Colombia         | Colombia          |
| Ecuador          | Ecuador           |
| Falkland Islands | Falkland Islands  |
| French Guiana    | Guyane française  |
| Guyana           | Guyana            |
| Paraguay         | Paraguay          |
| Peru             | Perú/Piruw        |
| Suriname         | Suriname          |
| Uruguay          | Uruguay           |
| Venezuela        | Venezuela         |
+------------------+-------------------+

Ở đây, chúng ta có tên quốc gia ở cột bên trái và tên địa phương của quốc gia tương ứng ở bên phải.

Hãy thêm NULLIF() đến cột thứ ba trong truy vấn của chúng tôi:

SELECT
    Name,
    LocalName,
    NULLIF(LocalName, Name) AS "Local Name if Different"
FROM country 
WHERE Region = 'South America'
ORDER BY Name;

Kết quả:

+------------------+-------------------+-------------------------+
| Name             | LocalName         | Local Name if Different |
+------------------+-------------------+-------------------------+
| Argentina        | Argentina         | NULL                    |
| Bolivia          | Bolivia           | NULL                    |
| Brazil           | Brasil            | Brasil                  |
| Chile            | Chile             | NULL                    |
| Colombia         | Colombia          | NULL                    |
| Ecuador          | Ecuador           | NULL                    |
| Falkland Islands | Falkland Islands  | NULL                    |
| French Guiana    | Guyane française  | Guyane française        |
| Guyana           | Guyana            | NULL                    |
| Paraguay         | Paraguay          | NULL                    |
| Peru             | Perú/Piruw        | Perú/Piruw              |
| Suriname         | Suriname          | NULL                    |
| Uruguay          | Uruguay           | NULL                    |
| Venezuela        | Venezuela         | NULL                    |
+------------------+-------------------+-------------------------+

Chúng ta có thể thấy rằng cột thứ ba chỉ trả về tên cục bộ nếu nó khác với giá trị trong Name cột. Nếu nó giống nhau thì NULL được trả lại.

Chúng tôi cũng có thể sử dụng NULLIF() để lọc kết quả truy vấn của chúng tôi:

SELECT 
    Name,
    LocalName
FROM country 
WHERE Region = 'South America'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;

Kết quả:

+---------------+-------------------+
| Name          | LocalName         |
+---------------+-------------------+
| Brazil        | Brasil            |
| French Guiana | Guyane française  |
| Peru          | Perú/Piruw        |
+---------------+-------------------+

Trong trường hợp này, chúng tôi chỉ trả về những hàng có tên cục bộ khác với Name cột.

NULLIF() so với CASE

Như đã đề cập, đoạn mã sau:

NULLIF (V1, V2)

tương đương với CASE sau biểu thức:

CASE WHEN V1=V2 THEN NULL ELSE V1 END

Vì vậy, có thể sử dụng CASE biểu thức thay vì NULLIF() nếu muốn. NULLIF() về cơ bản hàm là một phím tắt cú pháp cho CASE biểu thức.

Vì vậy, ví dụ:chúng ta có thể thay thế ví dụ trước bằng ví dụ sau:

SELECT 
    Name,
    LocalName
FROM country 
WHERE Region = 'South America'
AND (CASE WHEN LocalName = Name THEN NULL ELSE LocalName END) IS NOT NULL
ORDER BY Name;

Kết quả:

+---------------+-------------------+
| Name          | LocalName         |
+---------------+-------------------+
| Brazil        | Brasil            |
| French Guiana | Guyane française  |
| Peru          | Perú/Piruw        |
+---------------+-------------------+

Tuy nhiên, NULLIF() hàm ngắn gọn hơn nhiều.

Đếm tham số không chính xác

Truyền sai số đối số, dẫn đến lỗi:

SELECT NULLIF( 'One' );

Kết quả trong MySQL:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $ dayOfYear

  2. Hợp nhất hai trường mảng trong mongoDB

  3. MongoDB $ toDate

  4. Toán tử $ unwind trong MongoDB là gì?

  5. Thêm trường không có trong giản đồ với mongoose