【问题标题】:SQLite equivalent to ISNULL(), NVL(), IFNULL() or COALESCE()SQLite 等效于 ISNULL()、NVL()、IFNULL() 或 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 表中的匹配记录将不存在,所以返回的某些字段将为空。

【问题讨论】:

    标签: .net sqlite dbnull


    【解决方案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() 函数的工作方式与其他数据库相同。

    来源:

    【讨论】:

      【解决方案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。
      猜你喜欢
      • 1970-01-01
      • 2013-07-23
      • 2011-09-30
      • 2016-12-16
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 2018-08-09
      • 2011-06-12
      相关资源
      最近更新 更多