Sqlite:如果结果为空,则为最大子查询设置默认值

Posted

技术标签:

【中文标题】Sqlite:如果结果为空,则为最大子查询设置默认值【英文标题】:Sqlite: Setting default value for a max sub-query if result is null 【发布时间】:2013-02-16 06:58:17 【问题描述】:

我想为表中的子组增加一个序列号,但如果子组不存在,那么序列应该从 1 开始:

例如,在下面,如果class=5的表中不存在记录,我们希望将sequence设置为1;如果存在这样的记录,则 sequence 应取值 max sequence (in subgroup class=5) + 1:

update order set class=5, sequence=(select max(sequence) from order 
where class=5)+1 where order_id=104;

问题是上述不适用于初始情况。

【问题讨论】:

【参考方案1】:

在这些情况下,COALESCE() 函数就派上用场了:

UPDATE order
SET class = 5,
    sequence = coalesce(
        (SELECT max(sequence)
         FROM order 
         WHERE class=5),
        0
    ) + 1
WHERE order_id = 104

COALESCE 的另一个好处是它被大多数其他 SQL 引擎支持 - mysql、Postgres 等...

【讨论】:

嗯,这值得一票,因为“与大多数人一起工作”添加......我糟糕的自我总是用谷歌搜索“NVL SQL-Engine Name Alternative”;-)【参考方案2】:

只需用IFNULL( QUERY, 0 ) 函数包围您的查询

http://www.sqlite.org/lang_corefunc.html#ifnull

【讨论】:

以上是关于Sqlite:如果结果为空,则为最大子查询设置默认值的主要内容,如果未能解决你的问题,请参考以下文章

如果列结果为空,C++ SQLite 停止错误

如果请求值为空,Laravel 设置默认值

Sqlite:在子查询“消除”结果中排序

如果不为空,则为指针赋值

【Mybatis】collection一对多查询子查询集合不为空,但属性值为空

SQLite,根据联合子查询的结果插入或忽略