SQLite Order by WHERE IN 子句

Jos*_*ter 2 sqlite sql-order-by where-in activeandroid android-sqlite

我正在使用 SQLite 并提供id要检索的值列表。但是,这些id值的顺序很重要,我想以相同的顺序检索记录。

例如,

SELECT 
  * 
FROM 
  todos
WHERE 
  todos.id in ( 1, 3, 2, 4 ) 
Run Code Online (Sandbox Code Playgroud)

这将返回:

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

但我希望它以与提供的id值相同的顺序返回,如下所示:

1
3
2
4
Run Code Online (Sandbox Code Playgroud)

我已经看到了 MySQL 和 PostgreSQL 的答案,但没有看到 SQLite 的答案。

Jos*_*ter 9

ORDER BY CASE id WHEN x THEN y

在一个不起眼的 SQLite 论坛中找到它。

有一种非常具体但适合以编程方式生成的东西的巧妙排序方式。

要实现所需的顺序,您可以使用以下命令:

SELECT 
  * 
FROM 
  todos
WHERE 
  todos.id in ( 1, 3, 2, 4 ) 
ORDER BY 
  CASE todos.id  
  WHEN 1 THEN 1 
  WHEN 3 THEN 2 
  WHEN 2 THEN 3 
  WHEN 4 THEN 4
  END
Run Code Online (Sandbox Code Playgroud)

这将按以下顺序返回记录:

1
3
2
4
Run Code Online (Sandbox Code Playgroud)

如您所见,您正在手动指定每条记录的顺序。如果您手动执行此操作,这将很费力,但如果您使用的是编程语言,则可以轻松地对其进行编程并附加到查询中。

例如,我在 Android/Java 中使用它并最终做了这样的事情来生成这个ORDER BY子句:

String orderBy = "CASE todos.id ";

int i = 1;
for ( int id : ids ) {
    orderBy = orderBy.concat( " WHEN " + id + "' THEN " + i );
    i++;
}

orderBy = orderBy.concat( " END");

// Append `orderBy` to your normal SQLite query.
Run Code Online (Sandbox Code Playgroud)