等同于ISNULL(),NVL(),IFNULL()或COALESCE()的SQLite


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在某些情况下,我需要使用一些子句,其中某些返回的字段将为null,因为LEFT JOIN表中的匹配记录将不存在。

Answers:


130

IFNULL,请参见此处:http : //www.sqlite.org/lang_corefunc.html#ifnull

功能周围没有括号


ah,是方括号。感谢那。让我发疯的是,文档说它得到了支持(那里也有合并文件),但是它没有用。那些日子之一……
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参数的副本,如果两个参数均为NULL,则返回NULL。Ifnull()必须有2个参数。该ifnull()函数等效于coalesce()两个参数。


1
是的,我发现这是ifnull我想要的...我只需要放下使用的方括号即可。
杰森·唐

@HardikDarji因为有些不愿投票的快乐管理员看到了“尝试这个”字样,所以不再赘述。或者,因为有人错误地认为将ifnull()与Coalesce()进行比较是错误的,就像在其他数据库环境中一样(但在sqlite中不是)。无论如何,谁在乎。“尝试此”答案比“阅读文档”答案更好。每次我都会浏览包含答案的非代码/甚至不会阅读它们。感谢你的回答!
maplemale

25

如果没有ISNULL()方法,则可以改用以下表达式:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

这与的工作原理相同ISNULL(fieldname, 0)


1
该函数与问题所要查询的函数ifnull的SQLite等效isnull。对于现在阅读本文的任何人,在使用编写您自己的解决方案之前,请先参阅SQLMenace的答案(不过早于一年半以前)CASE
spaaarky21 2014年

1
@ spaaarky21-您说的很对。但是,此答案对于可能仅将sqlite用于单元测试以及将其他RDBMS用于实时代码的用户很有帮助。在这种情况下,使用类似CASE语句的方法可能比有意义IFNULL
赛斯·

2
@sethflowers我可以看到以更RDBMS中立的方式实现空默认值的价值,但这就是对另一个问题的答案。:) OP仅要求提供与isnull其他系统等效的SQLite ,而我不想鼓励人们“自己动手”。
spaaarky21

我只是在寻找诸如ifnotnull()或ifnonnull()之类的东西来补充ifnull(),以便在SELECT子句中的字符串连接中使用以显示“ last_name,first_name”,但仅在first_name为非null时才连接逗号。这种方法让我做到了。
steve_0804 '19

3

在WHERE子句中使用IS NULLIS NOT NULL代替ISNULL()方法:

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL

请编辑更多信息。不建议使用纯代码和“尝试此”答案,因为它们不包含可搜索的内容,并且不解释为什么有人应该“尝试此”。
abarisone

1
这与要求的内容无关。OP不想过滤出myField1具有非null值的行,他希望将结果列中的值替换为另一个(如果行值为null)。
Daniel Kamil Kozar

2

对于等效的NVL()和ISNULL(),请使用:

IFNULL(column, altValue)

column :您正在评估的列。

altValue :如果'column'为null,则要返回的值。

例:

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。
丹尼尔·卡米尔·科扎尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.