使零出现在升序列表的最后

时间:2010-07-12 21:48:38

标签: sql sqlite

我在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 个答案:

答案 0 :(得分:10)

等同于CASE声明建议,但更短:

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

答案 1 :(得分:4)

试试这个:

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

我没有在SQLite中测试过,但是在许多其他数据库中工作过,所以希望它也可以在SQLite中运行。

答案 2 :(得分:0)

我不完全确定SQLite是否允许“order by”中的case语句,但是请尝试以下几行:

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

答案 3 :(得分:0)

你可以添加一个额外的列作为过滤器,然后按两列排序吗?

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

答案 4 :(得分:0)

  

通过解码订购(epoch_date.epoch,0,null,epoch_date.epoch)

你可以使用类似这样的东西..因为在升序的情况下,最终会保留空值。 如果您在sqlite中可以使用解码功能,那么您可以使用case语句。

Ravi Kumar