SQLite 中的 IFNULL() 函数是一个 IF-ELSE 的函数,如果第一个参数为 NULL,返回第二个参数,否则返回第一个参数。
IFNULL 语法 | ||||
---|---|---|---|---|
ifnull(expr1, expr2) | ||||
参数 | ||||
expr1 | 必需的。判断此表达式是否为 NULL。 | |||
expr2 | 必需的。当 expr1 为 NULL 时,返回 expr2。 | |||
返回值 | ||||
如果 expr1 为 NULL,ifnull() 函数返回 expr2,否则返回 expr1。 | ||||
示例 | ||||
SELECT ifnull(NULL, 'It is NULL'), ifnull('I am not NULL', 'x'); | ||||
Output It is NULL, I am not NULL |
IFNULL() 函数的语法介绍至此,那么这个函数到底有什么用呢?试想下,有这样一个应用场景,我们正在完成一个阅读类的应用,需要实现一个每日阅读时间的统计功能。首先,需要将单本书籍的阅读时间进行累加;最后,再将不同书籍各自累加的时间进行求和就可以实现每日阅读时间的统计功能。下面进行表的设计:
1 | CREATE TABLE time(id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, book_id INTEGER, view_time BIGINT, date TEXT, UNIQUE(username, book_id, date)) |
建表语句共创建了五个字段:id、username、book_id、view_time,date,并将 username、book_id 和 date 组成了联合约束。看到约束语句,估计你已经知道我打算怎么去插入或更新数据了。没错,可以使用插入或替换语句来执行操作。语句如下:
1 | INSERT OR REPLACE INTO time(username, book_id, view_time) VALUES ('sunzn', 1, 5 + IFNULL((SELECT view_time FROM time WHERE username='sunzn' AND book_id=1 AND date='2023-02-21'), 0), '2023-02-21') |
这条语句兼具了插入、更新操作,插入或更新数据的时候会自动将新增的阅读时间和表中记录的阅读时间进行累加。这里我设置的新增时间为 5,插入数据的时候会先去查询对应 username、book_id 和 date 条件的阅读时间,如果查到的数据为空,就返回 0 与 5 相加完成首次数据的新增。如果查到的数据不为空,则用查到的值与 5 进行相加完成数据的更新。至此,单本书籍的阅读时间累加功能就完成了。我们单独将 IFNULL 函数摘出来看下,是不是很简单。
1 | IFNULL((SELECT view_time FROM time WHERE username='sunzn' AND book_id=1 AND date='2023-02-21'), 0) |