【发布时间】:2011-02-01 04:18:18
【问题描述】:
假设我使用 where 子句查询数据库
WHERE _id IN (5,6,424,2)
有什么方法可以让返回的游标按照_id 在列表中的位置排序? Cursor中_id属性从第一个到最后一个是5、6、424、2?
这恰好是通过 ContentProvider 在 Android 上实现的,但这可能不相关。
【问题讨论】:
标签: sql sorting where-clause
假设我使用 where 子句查询数据库
WHERE _id IN (5,6,424,2)
有什么方法可以让返回的游标按照_id 在列表中的位置排序? Cursor中_id属性从第一个到最后一个是5、6、424、2?
这恰好是通过 ContentProvider 在 Android 上实现的,但这可能不相关。
【问题讨论】:
标签: sql sorting where-clause
使用子查询选择 ID 列表并加入:
select t1.*
from t1
inner join
(
select 1 as id, 1 as num
union all select 5, 2
union all select 3, 3
) ids on t1.id = ids.id
order by ids.num
UPD:代码已修复
【讨论】:
一种方法可能是在每个 SQL 查询之间使用 UNION 来执行单独的 SQL 查询。您显然会按照您希望返回给您的顺序发出每个查询。
【讨论】:
...
订购者
_id=5 然后 1 的情况
当 _id=6 然后 2
结束
等等
【讨论】:
您可以将其加入到包含按排序顺序所需的列表的虚拟表中
select tbl.*
from tbl
inner join (
select 1 as sorter, 5 as value union all
select 2, 6 union all
select 3, 424 union all
select 4, 2) X on tbl._id = X.value
ORDER BY X.sorter
【讨论】:
virtual table 可以是 CTE(更易于阅读,IMO)甚至是基表。标准 SQL 不允许在 ORDER BY 子句中使用相关名称,这意味着 sorter 列需要包含在 SELECT 子句中,这不是坏事,因为将“排序器”列公开给无论如何调用者。
列表?你没有清单! ;)
这个:
WHERE _id IN (5,6,424,2)
只是语法糖:
WHERE (
_id = 5
OR _id = 6
OR _id = 424
OR _id = 2
)
SQL 只有一种数据结构,即表。你的(5,6,424,2) 也不是一张桌子! :)
您可以创建一个值表,但您的下一个问题是表没有任何逻辑顺序。因此,根据@cyberkiwi 的回答,您必须显式创建一个列来为排序顺序建模。为了使其对调用应用程序明确,请确保在查询的 SELECT 子句中公开此列。
【讨论】: