SQLite เทียบเท่ากับ ISNULL (), NVL (), IFNULL () หรือ COALESCE ()


92

ฉันต้องการหลีกเลี่ยงการตรวจสอบจำนวนมากดังต่อไปนี้ในรหัสของฉัน:

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

ฉันคิดว่าฉันสามารถให้แบบสอบถามของฉันดูแลค่าว่างได้โดยทำสิ่งนี้:

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

ฉันใช้ SQLite และดูเหมือนว่าจะไม่รู้จักisnullฟังก์ชันนี้ ฉันได้พยายามยังคนเทียบเท่าบางส่วนได้รับการยอมรับในฐานข้อมูลอื่น ๆ ( NVL(), IFNULL()และCOALESCE()) แต่ SQLite ดูเหมือนจะไม่รับรู้ใด ๆ ของพวกเขา

ใครมีคำแนะนำหรือรู้วิธีที่ดีกว่านี้ น่าเสียดายที่ฐานข้อมูลไม่มีค่าเริ่มต้นสำหรับทุกฟิลด์ นอกจากนี้ฉันจำเป็นต้องใช้บางส่วนLEFT JOINในบางกรณีซึ่งบางฟิลด์ที่ส่งคืนจะเป็นโมฆะเนื่องจากไม่มีระเบียนที่ตรงกันในLEFT JOINตาราง

คำตอบ:


130

IFNULLดูที่นี่: http://www.sqlite.org/lang_corefunc.html#ifnull

ไม่มีวงเล็บรอบฟังก์ชัน


มันคือวงเล็บเหลี่ยม ขอบคุณสำหรับสิ่งนั้น ทำให้ฉันคลั่งไคล้ที่เอกสารบอกว่าได้รับการสนับสนุน (มีการรวมกันอยู่ในนั้นด้วย) แต่มันไม่ทำงาน วันหนึ่ง ...
Jason Down

1
ฉันเข้าใจว่าคำอธิบายของคุณ "ไม่มีวงเล็บรอบฟังก์ชัน" อ้างอิงคำถาม แต่ด้วยข้อความเช่นนั้นจะช่วยได้เมื่อมีตัวอย่างอยู่ใต้ข้อความเริ่มต้นของคุณ
palswim

40

ลองทำตามนี้

ifnull(X,Y)  

เช่น

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

ifnull()ฟังก์ชันส่งกลับสำเนาของการโต้แย้งที่ไม่เป็นโมฆะเป็นครั้งแรกหรือ NULL ถ้าข้อโต้แย้งทั้งสองเป็นโมฆะ Ifnull()ต้องมี 2 อาร์กิวเมนต์ ifnull()ฟังก์ชั่นเทียบเท่ากับcoalesce()กับสองข้อโต้แย้ง


1
ใช่ฉันรู้แล้วว่าifnullฉันต้องการ ... ฉันแค่ต้องวางวงเล็บเหลี่ยมที่ฉันใช้
Jason Down

@HardikDarji เนื่องจากแอดมินมีความสุขบางส่วน downvote เห็นคำว่าลองนี้แล้วอ่านไม่ออก หรือเนื่องจากมีคนสันนิษฐานว่าการเปรียบเทียบ ifnull () กับ coalesce () ของคุณผิดพลาดเนื่องจากจะอยู่ในสภาพแวดล้อม db อื่น ๆ (แต่ไม่ใช่ใน sqlite) ไม่ว่าในกรณีใดใครสนใจ คำตอบ "ลองนี้" ดีกว่าคำตอบ "อ่านเอกสารประกอบ" ฉันจะอ่านคำตอบที่ไม่มีรหัส / ไม่แม้แต่จะอ่านทุกครั้ง ขอบคุณสำหรับคำตอบ!
maplemale

25

หากไม่มีISNULL()วิธีการคุณสามารถใช้นิพจน์นี้แทน:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

ใช้งานได้เช่นเดียวกับISNULL(fieldname, 0).


1
ฟังก์ชันifnullนี้เทียบเท่ากับ SQLite ของisnullฟังก์ชันที่ถามถึง สำหรับทุกคนที่อ่านตอนนี้โปรดดูคำตอบของ SQLMenace (จากปีครึ่งก่อนหน้านี้อย่างไรก็ตาม) ก่อนที่จะเขียนโซลูชันของคุณเองโดยใช้CASE.
spaaarky21

1
@ spaaarky21 - คุณเป็นจุดที่ดี อย่างไรก็ตามคำตอบนี้มีประโยชน์สำหรับผู้ที่ใช้ sqlite เพียงเพื่อการทดสอบหน่วยและใช้ RDBMS อื่นสำหรับโค้ดสด ในกรณีที่ใช้สิ่งที่ต้องการงบอาจทำให้รู้สึกมากกว่าCASE IFNULL
Seth Flowers

2
@sethflowers ฉันสามารถเห็นค่าในการใช้ค่าเริ่มต้นที่เป็นโมฆะด้วยวิธีที่เป็นกลางมากกว่า RDBMS แต่นั่นคือคำตอบสำหรับคำถามอื่น :) OP กำลังขอให้เทียบเท่ากับ SQLite isnullในระบบอื่น ๆ และฉันไม่ต้องการสนับสนุนให้ผู้คน "ม้วนของตัวเอง"
spaaarky21

ฉันแค่มองหาบางอย่างเช่น ifnotnull () หรือ ifnonnull () เพื่อเติมเต็ม ifnull () เพื่อใช้ในการต่อสตริงภายในส่วนคำสั่ง SELECT เพื่อแสดง "last_name, first_name" แต่จะเชื่อมต่อคอมมาเท่านั้นถ้า first_name ไม่ใช่ null วิธีนี้ให้ฉันทำ
steve_0804

3

ใช้IS NULLหรือIS NOT NULLใน WHERE-clause แทน ISNULL () method:

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL

โปรดแก้ไขด้วยข้อมูลเพิ่มเติม คำตอบที่ใช้รหัสอย่างเดียวและ "ลองใช้" เป็นสิ่งที่ไม่ควรทำเพราะไม่มีเนื้อหาที่ค้นหาได้และไม่ได้อธิบายว่าทำไมใครบางคนควร "ลองสิ่งนี้"
abarisone

1
ไม่เกี่ยวข้องกับสิ่งที่ถาม OP ไม่ต้องการกรองแถวที่myField1มีค่าที่ไม่ใช่ค่าว่างเขาต้องการแทนที่ค่าในคอลัมน์ผลลัพธ์ด้วยค่าอื่นหากค่าของแถวเป็นค่าว่าง
Daniel Kamil Kozar

2

สำหรับการใช้ NVL () และ ISNULL () ที่เทียบเท่า:

IFNULL(column, altValue)

column : คอลัมน์ที่คุณกำลังประเมิน

altValue : ค่าที่คุณต้องการส่งคืนหาก 'คอลัมน์' เป็นโมฆะ

ตัวอย่าง:

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

* หมายเหตุ: ฟังก์ชัน COALESCE () จะทำงานเช่นเดียวกับฐานข้อมูลอื่น ๆ

แหล่งที่มา:


-4

คุณสามารถกำหนดฟังก์ชันดังกล่าวและใช้งานได้อย่างง่ายดาย:

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

หรือเวอร์ชันลดขนาดเดียวกัน:

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

4
นั่นไม่ใช่ SQLite
Daniel Kamil Kozar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.