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 NULL
或 IS 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() 函数