有没有办法让NULL表现得像0(零)或像SQL中的空字符串?

时间:2015-06-02 10:59:32

标签: sql sqlite

假设一个带有整数列的sqlite数据库。

现在,趋势是整数字段也包含NULL值(= unset)。

我想在对该字段进行查询时将NULL值解释为零(0)。

有没有办法告诉sqlite我喜欢在这种情况下像0一样处理NULL,尤其是当我使用SELECT语句进行比较时?

由于我使用类似C的代码动态构造查询,我希望能够编写类似这样的内容:

query = "SELECT * FROM tbl WHERE intField=" + IntToStr(anIntValue)

目前,我使用以下代码解决此问题,我希望避免使用此代码:

if (anIntValue == 0) {
  query = "SELECT * FROM tbl WHERE intField IS NULL OR intField=0"
} else {
  query = "SELECT * FROM tbl WHERE intField=" + IntToStr(anIntValue)
}

也许我可以在查询中使用一个运算符,将NULL转换为我指定的其他值?

当然,另一种方法是确保一个永远不会在该字段中以NULL值结束,但是人们可能希望能够告诉该值何时尚未设置,所以我喜欢成为能够在数据库中保留NULL值。

4 个答案:

答案 0 :(得分:4)

在标准SQL中,这称为COALESCE

COALESCE(col, 0)

为什么使用像IFNULL / NVL这样的专有扩展,如果每个DBMS都支持一个标准?

答案 1 :(得分:2)

请尝试ifnull功能,请参阅http://www.sqlite.org/lang_corefunc.html#ifnull

上的文档

答案 2 :(得分:1)

您可以使用 IFNULL

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

这与isnull(fieldname, 0)

的作用相同

您可以阅读更多here

答案 3 :(得分:1)

虽然您可以使用RDBMS的空合并功能,但是存在一种通用方法,允许您在条件中将NULL视为零,如下所示:

String val = IntToStr(anIntValue)
"SELECT * FROM tbl WHERE intField=" + val + " OR (0="+ val+" AND intField IS NULL)"