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.