PostgreQuery tương đương với ISNULL () là gì


255

Trong MS SQL-Server, tôi có thể làm:

SELECT ISNULL(Field,'Empty') from Table

Nhưng trong PostgreSQL tôi gặp lỗi cú pháp. Làm thế nào để tôi mô phỏng các ISNULL()chức năng?


1
Không, bạn không thể làm điều đó trong MSSQL. Mã đó sẽ không biên dịch. ISNULLlấy hai đối số và trả về cái thứ hai là cái thứ nhất null, nếu không thì cái thứ nhất.
GSerg

@GSerg, bạn nói đúng. Đã sửa mà.
Byron Whitlock

Gserg và Byron, vâng, bạn có thể xem ở đây Ví dụ từ PC SELECT của tôi không phải là (a.FechaEntregada, '') khi thử nghiệm từ dbo.Amonestacur một msdn.microsoft.com/en-us/l
Juan

Câu trả lời:


453
SELECT CASE WHEN field IS NULL THEN 'Empty' ELSE field END AS field_alias

Hoặc thành ngữ hơn:

SELECT coalesce(field, 'Empty') AS field_alias

49
+1 cho coalesce. (PS Bạn cũng có thể làm điều đó trong MS SQL Server.)
Alison R.

2
Có nhiều trường hợp khác để sử dụng IS NULL, vì vậy thật tốt khi biết cả hai.
Kyle Mông

30
Tôi nghĩ rằng đáng chú ý rằng đó là coalescetrong tiêu chuẩn SQL, với isnullchức năng dành riêng cho MS mà về cơ bản coalescechỉ có hai tham số.
GSerg

4
Coalesce () cũng xử lý quảng cáo kiểu đúng cách (chính xác như UNION SELECT), trong khi IsNull () thì không.
ErikE

2
Điều đáng nói là ISNULL và COALESCE không giống nhau. IsNull buộc loại kết quả thành loại đối số1, trong khi kết hợp sử dụng các loại tương ứng cho mỗi đối số. Nếu bạn chỉ tìm kiếm và thay thế không hợp lệ, bạn có thể gặp rất nhiều lỗi ...
Stefan Steiger

76

Sử dụng COALESCE()thay thế:

SELECT COALESCE(Field,'Empty') from Table;

Nó hoạt động giống như ISNULL, mặc dù cung cấp nhiều chức năng hơn. Coalesce sẽ trả về giá trị không null đầu tiên trong danh sách. Như vậy:

SELECT COALESCE(null, null, 5); 

trả về 5, trong khi

SELECT COALESCE(null, 2, 5);

trả về 2

Hợp nhất sẽ có một số lượng lớn các đối số. Không có tài liệu tối đa. Tôi đã thử nó sẽ 100 đối số và nó đã thành công. Điều này sẽ rất nhiều cho phần lớn các tình huống.


24

Làm cách nào để mô phỏng chức năng ISNULL ()?

SELECT (Field IS NULL) FROM ...

4
Điều này mô phỏng chức năng chính xác của isnull, không chắc tại sao nó bị hạ cấp
smackshow 26/03/13

Câu trả lời tốt nhất cho câu hỏi, tất nhiên. Biểu thức này là tương đương đầy đủ của ISNULL (). COALESCE () rất thông minh và thú vị để biết nhưng nó không thể thực hiện ISNULL () trong khi nó bị đóng.
Skrol29

17
Tôi không biết những gì các nhà ISNULLbình luận của bạn đang đề cập đến, nhưng field IS NULLđưa ra một giá trị boolean, trong khi ISNULLtrong SQL Server hoạt động như COALESCEsau: nó trả về một trong những NULLgiá trị không . Câu trả lời này là sai lầm khủng khiếp. Xem tài liệu : ISNULL.
jpmc26

10
Tôi nghi ngờ những người bình luận này là những người dùng MySQL đã không nhận ra câu hỏi bắt đầu bằng "Trong MS SQL Server, ..." MySQL có hàm ISNULL () nhận một đối số duy nhất và trả về 0 hoặc 1. Phiên bản của T-SQL mất hai đối số và hành xử như COALESCE hoặc NVL của Oracle.
David Noha

1
greatvovan, dù đây có phải là mục đích của poster gốc hay không, tôi tin rằng những gì mọi người đang muốn là câu trả lời cho "Làm cách nào để kiểm tra xem một trường có rỗng không", không nhất thiết là "Chức năng ISNULL hoạt động chính xác như thế nào". Đó là trường hợp với tôi và câu trả lời này là hoàn hảo cho điều đó.
Freeman Helmuth

15

Thử:

SELECT COALESCE(NULLIF(field, ''), another_field) FROM table_name

3
Điều này thật tuyệt vì nó bao gồm trường hợp khi một trường văn bản KHÔNG rỗng, nhưng cũng 'trống rỗng'.
soulia

-9

Tạo chức năng sau

CREATE OR REPLACE FUNCTION isnull(text, text) RETURNS text AS 'SELECT (CASE (SELECT $1 "
    "is null) WHEN true THEN $2 ELSE $1 END) AS RESULT' LANGUAGE 'sql'

Và nó sẽ hoạt động.

Bạn có thể tạo các phiên bản khác nhau với các loại tham số khác nhau.


28
Xin vui lòng, không ai làm điều này. Sử dụng coalesce () thay vào đó để DBA của bạn không ghét bạn.
Jordan

1
postgres vui lòng thêm isnull để không ai ghét ai cả.
Eric Twilegar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.