在sqlite中将null排序到底部,并使用预先存在的索引

Sort nulls to bottom in sqlite AND use pre-existing index

提问人:Andy Thomas 提问时间:11/9/2023 更新时间:11/9/2023 访问量:30

问:

我有一个以用户界面表形式呈现的 sqlite 数据库表。用户可以单击列标题以指定多列排序顺序。有些列是文本,有些是整数或实数。

该表可能足够大,以至于创建临时索引会引入可观察且令人讨厌的延迟。所以我想使用预先存在的索引。例如:

CREATE INDEX MyTable_name on MyTable ( name, color, position );

但我也希望空和空格排序到底部。所以我的查询可以包含一个 ORDER BY,如下所示:

ORDER BY (CASE WHEN ((name IS NULL) OR (name = '')) THEN 1 ELSE 0 END) ASC, name ASC,
    (CASE WHEN ((color IS NULL) OR (color = '')) THEN 1 ELSE 0 END) ASC, color ASC,
    (CASE WHEN ((position IS NULL) OR (position = '')) THEN 1 ELSE 0 END) ASC, position ASC

这与更简单的索引不匹配,因此 sqlite 将创建一个适当的临时索引。

QUERY PLAN
|--SCAN MyTable
`--USE TEMP B-TREE FOR ORDER BY

我怎样才能将空值排序到底部并使用预先存在的索引?

我突然想到,我可以通过用预先计算的 1 或 0 值对每一列进行阴影处理来解决这个问题,并将这些阴影列添加到索引和 ORDER BY 中。我希望有一个更简单的解决方案。

sql sqlite jdbc

评论

0赞 Andy Thomas 11/16/2023
我通过将每个 CASE 替换为具有预先计算的 1 或 0 值的影子列的名称,并将这些列包含在 CREATE INDEX 中来解决此问题。好东西:现在使用我的非临时索引。坏事:两倍的列数。

答: 暂无答案