【问题标题】:SQL WHERE IN (...) sort by order of the list?SQL WHERE IN (...) 按列表顺序排序?
【发布时间】: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


    【解决方案1】:

    使用子查询选择 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:代码已修复

    【讨论】:

    • 我认为你的内表需要 2 列。您拥有的 ID 和另一个序列列。然后按顺序排序。
    • 哎呀.. 是的,当然。这是我的错别字。
    【解决方案2】:

    一种方法可能是在每个 SQL 查询之间使用 UNION 来执行单独的 SQL 查询。您显然会按照您希望返回给您​​的顺序发出每个查询。

    【讨论】:

      【解决方案3】:

      ... 订购者
      _id=5 然后 1 的情况
      当 _id=6 然后 2
      结束

      等等

      【讨论】:

        【解决方案4】:

        您可以将其加入到包含按排序顺序所需的列表的虚拟表中

        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 子句中,这不是坏事,因为将“排序器”列公开给无论如何调用者。
        • @onedaywhen 这应该适用于 SQLite、SQL Server、Sybase、MySQL 和 PostgreSQL。 CTE 不适用于其中 4 个,MSSQL pre-2005,也不适用于没有“来自双重”的 Oracle。问题通常是“sql”。它是 Android,所以我怀疑它不是 MSSQL
        • 当我只看到“sql”标签时,我倾向于认为标准 SQL 和 CTE 都在标准中(和 postgre,顺便说一句)。这并不一定意味着所有流行的 SQL 产品都支持它;)
        【解决方案5】:

        列表?你没有清单! ;)

        这个:

        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 子句中公开此列。

        【讨论】:

          猜你喜欢
          • 2010-09-28
          • 1970-01-01
          • 1970-01-01
          • 2010-10-26
          • 2018-09-15
          • 1970-01-01
          • 2016-10-03
          相关资源
          最近更新 更多