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

SQL COALESCE () Giải thích

Hầu hết các RDBMS chính đều hỗ trợ COALESCE() toán tử, trả về giá trị khác rỗng đầu tiên từ danh sách các đối số của nó.

COALESCE() 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:

COALESCE (V1, V2, ..., Vn)

Vì vậy, cần có ít nhất một đối số, nhưng có thể (và thường là) cung cấp nhiều đối số.

COALESCE() được coi là một n - toán tửadic. Nói cách khác, nó là một toán tử có một số toán hạng thay đổi (tức là n toán hạng).

Ví dụ

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

SELECT COALESCE(null, 'Papaya', 'Salad');

Kết quả:

Papaya

Trong trường hợp này, Papaya là giá trị không rỗng đầu tiên và vì vậy COALESCE() đã trả lại giá trị đó.

Salad cũng là một giá trị không rỗng, nhưng nó đến sau Papaya và vì vậy nó đã không được trả lại.

COALESCE() so với CASE

COALESCE() thường được coi là một phím tắt cú pháp cho CASE biểu hiện.

Như vậy, câu lệnh sau:

COALESCE (V1, V2) 

tương đương với:

CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END

Và tuyên bố sau:

COALESCE (V1, V2, ..., Vn)

(cho n ≥ 3) Tương đương với:

CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END

Khi tất cả các giá trị đều rỗng

Nếu tất cả các giá trị null , COALESCE() trả về null :

SELECT COALESCE( null, null );

Kết quả:

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).

Trong SQL Server, nếu tất cả các đối số null , thì ít nhất một trong các giá trị null phải là null đã nhập . Do đó, ví dụ trên thực sự dẫn đến lỗi (vì tất cả các đối số null đều là null hằng số).

Biểu thức

COALESCE() trả về giá trị hiện tại của biểu thức đầu tiên mà ban đầu không đánh giá thành null . Do đó, nếu chúng ta truyền một biểu thức như sau:

SELECT COALESCE( null, 3 * 5 );

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

15

Ví dụ về cơ sở dữ liệu

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

SELECT
  name,
  salary
FROM employee;

Và chúng tôi nhận được kết quả sau:

 name  | salary 
-------+--------
 Elise | 100000
 Rohit |  50000
 Homer |   null

Chúng ta có thể thấy rằng hàng cuối cùng có giá trị null trong DOB cột.

Nếu chúng tôi muốn thay thế giá trị null bằng một giá trị khác, chúng tôi có thể sử dụng COALESCE() như sau:

SELECT
  name,
  COALESCE(salary, 0) AS salary
FROM employee;

Kết quả:

 name  | salary 
-------+--------
 Elise | 100000
 Rohit |  50000
 Homer |      0

Trong trường hợp này, chúng tôi đã thay thế tất cả các giá trị null bằng số nguyên 0 .

Sự khác biệt giữa các RDBMS

Nói chung, COALESCE() hoạt động khá giống nhau trên các RDBMS.

Nhưng có một số khác biệt.

Loại dữ liệu

Chúng ta có thể làm như sau trong MySQL, MariaDB và SQLite:

SELECT
  name,
  COALESCE(salary, 'None') AS salary
FROM employee;

Kết quả:

name	salary
-----   ------
Elise	100000
Rohit	50000
Homer	None

Trong trường hợp này, bất cứ khi nào salary cột chứa giá trị null, đầu ra là None .

Nhưng truy vấn đó có thể gây ra sự cố trong Cơ sở dữ liệu SQL Server, PostgreSQL hoặc Oracle.

Khi tôi chạy truy vấn đó trong SQL Server, PostgreSQL và Cơ sở dữ liệu Oracle, tôi gặp lỗi do giá trị thay thế là kiểu dữ liệu sai.

Đây là những gì SQL Server trả về khi tôi chạy truy vấn trên:

Msg 245, Level 16, State 1, Line 15
Conversion failed when converting the varchar value 'None' to data type int.

Đây là những gì PostgreSQL trả về:

ERROR:  invalid input syntax for type integer: "None"
LINE 3:   COALESCE(salary, 'None') AS salary
                           ^

Và đây là những gì Cơ sở dữ liệu Oracle trả về:

ORA-00932: inconsistent datatypes: expected NUMBER got CHAR

Nhưng nếu tôi sử dụng giá trị số, tôi không gặp lỗi:

SELECT
  name,
  COALESCE(salary, 0) AS salary
FROM employee;

Kết quả:

 name  | salary 
-------+--------
 Elise | 100000
 Rohit |  50000
 Homer |      0

Vì vậy, ví dụ cuối cùng này hoạt động trên tất cả sáu RDBMS ở trên.

Đối số rỗng

Một điểm khác biệt khác giữa cách xử lý RDBMSs COALESCE() là cách họ đối phó với các đối số rỗng.

Như đã đề cập, trong SQL Server, nếu tất cả các đối số là null , thì ít nhất một trong các giá trị null phải là null đã nhập . Nói cách khác, nếu tất cả các đối số cho COALESCE() là hằng số null, thì chúng ta gặp lỗi. Điều này không đúng với các RDBMS khác, trong đó tất cả các đối số có thể là hằng số null và kết quả đầu ra sẽ là null thay vì một lỗi.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. xác thực tùy chỉnh mongoose sử dụng 2 trường

  2. Các câu hỏi phỏng vấn MongoDB phổ biến

  3. Mongoose, Chọn một trường cụ thể với tìm

  4. Làm cách nào để xuất tất cả các bộ sưu tập trong MongoDB?

  5. Mongoose &trường độc đáo