SQLite 等效于 ISNULL()、NVL()、IFNULL() 或 COALESCE()

Posted

技术标签:

【中文标题】SQLite 等效于 ISNULL()、NVL()、IFNULL() 或 COALESCE()【英文标题】:SQLite equivalent to ISNULL(), NVL(), IFNULL() or COALESCE() 【发布时间】:2010-10-22 09:53:40 【问题描述】:

我想避免在我的代码中进行许多类似以下的检查:

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 表中的匹配记录将不存在,所以返回的某些字段将为空。

【问题讨论】:

【参考方案1】:

IFNULL,请看这里:http://www.sqlite.org/lang_corefunc.html#ifnull

函数周围没有括号

【讨论】:

呸,是方括号。感谢那。文档说它受支持(那里也有合并)让我发疯,但它不起作用。那些日子之一...... 我意识到你对“函数周围没有括号”的描述引用了这个问题,但是有了这样的陈述,在你的初始陈述下面有一个例子会有所帮助。【参考方案2】:

试试这个

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()

【讨论】:

是的,我发现我想要的是ifnull...我只需要删除我正在使用的方括号。【参考方案3】:

如果没有ISNULL()方法,你可以用这个表达式代替:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

这与ISNULL(fieldname, 0) 的作用相同。

【讨论】:

函数ifnull 是问题所问的isnull 函数的SQLite 等价物。对于现在正在阅读本文的任何人,请在使用 CASE 编写自己的解决方案之前查看 SQLMenace 的答案(不过一年半之前)。 @spaarky21 - 你说得很好。但是,此答案对于那些可能仅将 sqlite 用于单元测试并使用不同的 RDBMS 进行实时代码的人很有帮助。在这种情况下,使用类似CASE 的语句可能比IFNULL 更有意义。 @sethflowers 我可以看到以更加 RDBMS 中立的方式实现空默认值的价值,但这是对另一个问题的答案。 :) OP 只是在其他系统中要求 SQLite 等效于 isnull,我不想鼓励人们“自己动手”。 我只是在寻找类似 ifnotnull() 或 ifnonnull() 的东西来补充 ifnull(),用于 SELECT 子句中的字符串连接以显示“last_name,first_name”,但只连接逗号如果 first_name 不为空。这种方法让我做到了。【参考方案4】:

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

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL

【讨论】:

请编辑更多信息。不建议使用纯代码和“试试这个”的答案,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。 这与所询问的内容无关。 OP 不想过滤掉 myField1 具有非空值的行,如果行值为空,他想用不同的值替换结果列中的值。【参考方案5】:

对于 NVL() 和 ISNULL() 的等价物,使用:

IFNULL(column, altValue)

column :您正在评估的列。

altValue : 如果 'column' 为空,您要返回的值。

示例:

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

*注意:COALESCE() 函数的工作方式与其他数据库相同。

来源:

COALESCE() Function (w3schools) SQL As Understood By SQLite(SQLite 网站)

【讨论】:

【参考方案6】:

你可以很容易地定义这样的函数然后使用它:

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);

【讨论】:

那不是 SQLite。

以上是关于SQLite 等效于 ISNULL()、NVL()、IFNULL() 或 COALESCE()的主要内容,如果未能解决你的问题,请参考以下文章

C# 等效于 SQL Server 中的 IsNull() 函数

Orcale的nvl函数和SQL Server的isnull函数

数字数据类型的 Oracle 等效 NVL

选择使用 NVL 书写的字母。为啥?

如何在 HQL 中模拟 NVL

SQLite 的等效项是不是有一个 set identity_insert?