SQLite tương đương với ISNULL (), NVL (), IFNULL () hoặc COALESCE ()


92

Tôi muốn tránh có nhiều lần kiểm tra như sau trong mã của mình:

myObj.someStringField = rdr.IsDBNull(someOrdinal) 
                            ? string.Empty 
                            : rdr.GetString(someOrdinal);

Tôi đã nghĩ rằng tôi có thể chỉ cần truy vấn của tôi xử lý các null bằng cách làm một cái gì đó như sau:

SELECT myField1, [isnull](myField1, '') 
FROM myTable1
WHERE myField1 = someCondition

Mặc dù vậy, tôi đang sử dụng SQLite và nó dường như không nhận ra isnullchức năng. Tôi cũng đã thử một số những người tương đương được công nhận trong cơ sở dữ liệu khác ( NVL(), IFNULL()COALESCE()), nhưng SQLite dường như không nhận ra ai trong số họ.

Có ai có bất kỳ đề xuất hoặc biết về một cách tốt hơn để làm điều này. Thật không may, cơ sở dữ liệu không có giá trị mặc định cho tất cả các trường. Ngoài ra, tôi cần sử dụng một số LEFT JOINmệnh đề trong một số trường hợp, trong đó một số trường được trả về sẽ là giá trị rỗng vì bản ghi phù hợp trong LEFT JOINbảng sẽ không tồn tại.

Câu trả lời:


130

IFNULL, xem tại đây: http://www.sqlite.org/lang_corefunc.html#ifnull

không có dấu ngoặc quanh hàm


Bah đó là dấu ngoặc vuông. Cảm ơn vì điều đó. Tôi đã làm tôi phát điên khi tài liệu nói rằng nó được hỗ trợ (cũng có liên kết trong đó), nhưng nó không hoạt động. Một trong những ngày đó ...
Jason Down

1
Tôi nhận thấy mô tả của bạn về "không có dấu ngoặc nhọn xung quanh hàm" tham chiếu đến câu hỏi, nhưng với một tuyên bố như vậy, sẽ hữu ích nếu có một ví dụ bên dưới câu lệnh ban đầu của bạn.
palswim

40

Thử cái này

ifnull(X,Y)  

ví dụ

select ifnull(InfoDetail,'') InfoDetail; -- this will replace null with ''
select ifnull(NULL,'THIS IS NULL');-- More clearly....

Các ifnull()hàm trả về một bản sao của đầu tiên tranh luận không NULL của nó, hoặc NULL nếu cả hai đối số là NULL. Ifnull()phải có đúng 2 đối số. Các ifnull()chức năng tương đương với coalesce()với hai đối số.


1
Vâng, tôi đã nhận ra rằng nó là ifnulltôi muốn ... Tôi chỉ cần bỏ dấu ngoặc vuông mà tôi đang sử dụng.
Jason Down

@HardikDarji Vì một số admin vui vẻ downvote nhìn thấy dòng chữ "thử cái này" và không đọc thêm. Hoặc, do ai đó đã giả định sai so sánh ifnull () với thanesce () của bạn là do lỗi, giống như trong các môi trường db khác (nhưng không phải trong sqlite). Trong mọi trường hợp, những người quan tâm. Câu trả lời "Hãy thử này" tốt hơn câu trả lời "đọc tài liệu". Tôi sẽ đọc lướt các câu trả lời không chứa mã / thậm chí không đọc chúng, mọi lúc. Cảm ơn vì câu trả lời!
maplemale

25

Nếu không có ISNULL()phương thức, bạn có thể sử dụng biểu thức này để thay thế:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

Điều này hoạt động giống như ISNULL(fieldname, 0).


1
Hàm ifnulltương đương với SQLite của isnullhàm mà câu hỏi đang hỏi. Đối với bất kỳ ai đang đọc bài này, vui lòng xem câu trả lời của SQLMenace (từ hơn một năm rưỡi trước đó) trước khi viết giải pháp của riêng bạn bằng cách sử dụng CASE.
spaaarky21

1
@ spaaarky21 - Bạn làm cho một điểm tốt. Tuy nhiên, câu trả lời này hữu ích cho những người có khả năng sử dụng sqlite chỉ để kiểm tra đơn vị và sử dụng RDBMS khác cho mã trực tiếp. Trong trường hợp đó, sử dụng một cái gì đó như CASEcâu lệnh có thể có ý nghĩa hơn IFNULL.
Seth Flowers

2
@sethflowers Tôi có thể thấy giá trị trong việc triển khai các giá trị mặc định null theo cách RDBMS trung lập hơn nhưng đó là câu trả lời cho một câu hỏi khác. :) OP chỉ đơn giản là yêu cầu SQLite tương đương với isnulltrong các hệ thống khác và tôi sẽ không muốn khuyến khích mọi người "tự làm".
spaaarky21

Tôi chỉ đang tìm kiếm một cái gì đó giống như ifnotnull () hoặc ifnonnull () để bổ sung ifnull (), để sử dụng trong nối chuỗi trong mệnh đề SELECT để hiển thị "last_name, first_name" nhưng chỉ nối dấu phẩy nếu first_name không phải là null. Cách tiếp cận này cho phép tôi làm điều đó.
steve_0804

3

Sử dụng IS NULLhoặc IS NOT NULLtrong mệnh đề WHERE thay vì phương thức ISNULL ():

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL

Vui lòng chỉnh sửa với nhiều thông tin hơn. Các câu trả lời chỉ có mã và "thử cái này" không được khuyến khích vì chúng không chứa nội dung có thể tìm kiếm được và không giải thích tại sao ai đó nên "thử cái này".
abarisone

1
Điều đó không liên quan đến những gì đã được hỏi. OP không muốn lọc ra các hàng myField1có giá trị không phải null, anh ta muốn thay thế giá trị trong cột kết quả bằng một giá trị khác, nếu giá trị hàng là null.
Daniel Kamil Kozar

2

Đối với tương đương của NVL () và ISNULL (), hãy sử dụng:

IFNULL(column, altValue)

column : Cột bạn đang đánh giá.

altValue : Giá trị bạn muốn trả về nếu 'cột' là giá trị rỗng.

Thí dụ:

SELECT IFNULL(middle_name, 'N/A') FROM person;

* Lưu ý: Hàm COALESCE () hoạt động giống như đối với các cơ sở dữ liệu khác.

Nguồn:


-4

Bạn có thể dễ dàng xác định chức năng đó và sử dụng nó sau đó:

ifnull <- function(x,y) {
  if(is.na(x)==TRUE) 
    return (y)
  else 
    return (x);
}

hoặc cùng một phiên bản rút gọn:

ifnull <- function(x,y) {if(is.na(x)==TRUE) return (y) else return (x);}

4
Đó không phải là SQLite.
Daniel Kamil Kozar
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.