将零排在升序数字列表的最后。

3
我正在一个Android应用程序中使用SQLite。在我的所有表格中,我都有一个索引为0的默认行,该行保存该表的默认值。在大多数情况下,每个字段的默认数字为0,这是最好的数字。但是,当我使用ORDER BY语句对数据进行排序时,我希望将所有零值字段放在列表的末尾,因为它们通常为空并且使用默认信息。在where语句中排除这些字段是不可接受的,因为我试图对信息进行排序,而不是过滤它。以下是我目前的代码:
select distinct item.name, epoch_date.epoch
from epoch_date, time
where (time.begin_date_id = epoch_date._id)
and (item.time_id = time._id)
order by epoch_date.epoch;

在我的沙盒数据库中,这个语句会返回类似以下的结果:
"item 1", 0
"item 2", 0
"item 4", 0
.
.
.
"item 3",  1275350400
"item 42", 1275472800
"item 12", 1275472800

但是我想要的是:

"item 3",  1275350400
"item 42", 1275472800
"item 12", 1275476400
.
.
.
"item 1", 0
"item 2", 0
"item 4", 0
5个回答

10

相当于使用 CASE 语句建议,但更短:

 ORDER BY epoch_date.epoch == 0, epoch_date.epoch

越短越好。非常有效。谢谢。 - leetheguy

4

试试这个:

ORDER BY
    CASE epoch_date.epoch WHEN 0 THEN 1 ELSE 0 END,
    epoch_date.epoch

我没有在SQLite中进行测试,但在许多其他数据库中有效,因此希望在SQLite中也能正常工作。


0

我不完全确定SQLite是否允许在"order by"中使用case语句,但可以尝试以下方式:

order by case epoch_date.epoch when 0 then 999999 else epoch_date.epoch end

0

你能否添加一个额外的列作为过滤器,然后按照这两列进行排序?

select (...)epoch_date.epoch, case epoch_date.epoch when 0 then 1 else 0 as default
(...)
order by default,epoch_date.epoch

0
按照 decode(epoch_date.epoch,0,null,epoch_date.epoch) 的顺序排序。如果是升序,则将 null 保留在末尾。 假设您的 Sqlite 中可用 decode 函数,您可以使用类似以下的语句。否则,您可以使用 case 语句代替。
Ravi Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接