【问题标题】:How do I preserve the order of a SQL query using the IN command如何使用 IN 命令保留 SQL 查询的顺序
【发布时间】:2013-03-01 10:50:45
【问题描述】:
SELECT * FROM tblItems
WHERE itemId IN (9,1,4)

按照 SQL 找到它们的顺序(恰好是 1、4、9)返回,但是,我希望它们按照我在数组中指定的顺序返回。

我知道我可以用我的母语 (obj c) 对它们重新排序,但是在 SQL 中是否有一种简洁的方法可以做到这一点?

这样的东西会很棒:

ORDER BY itemId (9,1,4) --    <-- this dosn't work :)

【问题讨论】:

标签: sql sqlite


【解决方案1】:

可能最好的方法是创建一个项目 ID 表,其中还包括一个排名顺序。然后就可以加入并按排名排序了。

创建一个这样的表:

 itemID rank
 9      1
 1      2
 4      3

那么您的查询将如下所示:

select tblItems.* from tblItems
    inner join items_to_get on
        items_to_get.itemID = tblItems.itemID
    order by rank

【讨论】:

    【解决方案2】:

    使用CASE expression 将 ID 值映射到递增序列:

    ... ORDER BY CASE itemId
                 WHEN 9 THEN 1
                 WHEN 1 THEN 2
                 ELSE        3
                 END
    

    【讨论】:

    • 谢谢 - 这似乎工作!随着规模的扩大,是否存在任何效率问题?
    • 你会让 SQLite 在执行速度变得明显之前抱怨命令太长。无论如何,... IN (...) 会有同样的问题。如果您的 ID 列表太长而无法在命令字符串中逐字包含,则必须将 INORDER BY 替换为 dan1111 的解决方案。
    【解决方案3】:

    我曾经在 mysql 环境中做过同样的任务。

    我最终使用了

    ORDER BY FIND_IN_SET(itemID, '9,1,4')

    从那时起,这对我有用。我希望它也适用于 sqlite

    【讨论】:

      【解决方案4】:

      您可以将 case 构造添加到您的 select 子句中。

      select case when itemid = 9 then 1
      when itemid = 1 then 2 else 3 end sortfield
      etc
      order by sortfield
      

      【讨论】:

        【解决方案5】:

        您可以创建一个过程来对 SQL 中的数据进行排序,但这会比其本地语言对应物复杂得多。

        没有像在 SQL 中那样使用数据的“简洁方法”——SELECTWHERE 子句只是说“如果这些条件匹配,则包含该行”;它不是(也不能是)排序标准。

        【讨论】:

          猜你喜欢
          • 2016-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-05
          • 1970-01-01
          • 1970-01-01
          • 2013-07-08
          相关资源
          最近更新 更多