如何使用 SQLite 使用 UNION ALL 和 ORDER BY 进行排序

Posted

技术标签:

【中文标题】如何使用 SQLite 使用 UNION ALL 和 ORDER BY 进行排序【英文标题】:How to sort using UNION ALL and ORDER BY using SQLite 【发布时间】:2013-06-04 06:23:21 【问题描述】:

我在 android 的 SQLite 数据库中有一些数据。我想使用 WHERE 子句使用 LIKE 和 NOT LIKE 条件从数据库中检索数据。我正在使用 UNION ALL 命令组合两个语句。为此,查询是

SELECT * FROM TABLENAME WHERE column_name LIKE SOMTHING.

这将返回一些行。然后我正在写查询

SELECT * FROM TABLENAME WHERE column_name NOT LIKE SOMTHING.

这将返回剩余的行。

我想先返回第一个查询项,然后再返回第二个查询项。这可以通过使用 UNION ALL 命令来实现。所以查询就像

 db.rawQuery("SELECT * FROM TABLENAME WHERE column_name LIKE SOMTHING UNION ALL SELECT * FROM TABLENAME WHERE column_name NOT LIKE SOMTHING")

但我希望在第一个查询项目/项目之后和之后按排序顺序排列第二个查询项目。所以我写了这样的查询

 db.rawQuery("(SELECT * FROM TABLENAME WHERE column_name LIKE SOMTHING) UNION ALL (SELECT * FROM TABLENAME WHERE column_name NOT LIKE SOMTHING ORDER BY column_name)")

我需要该表中的所有数据,但首先我希望不需要排序的第一个查询返回的行,但在这些行之后,我希望所有行(不喜欢)按排序顺序, 我以排序形式获取所有数据,在第一个位置它没有返回第一个查询的行(在联合所有之前)

任何人都可以帮助我解决这个问题。提前致谢。

【问题讨论】:

什么实际上不起作用?在您的最后一个代码中,您只在联合之后对查询进行排序,而不是在联合之前对查询进行排序,这是问题所在吗? 我需要该表中的所有数据,但首先我希望不需要排序的第一个查询返回的行,但在这些行之后,我希望所有行(不喜欢的)按排序顺序,我是以排序形式获取所有数据,在第一个位置它不返回第一个查询的行(在联合所有之前) 首先你可能需要理解这样的封顶句子看起来很粗鲁。然后,如果您正在复制您在应用程序中编码的内容,那么您在查询末尾缺少 1 个右括号,请检查添加它是否可以解决您的问题。 我很抱歉我的错误。我不是从我的代码中复制这个。现在我编辑了我的帖子。 该代码应该可以工作,至少它可以在我的应用程序中工作。所谓的“column_name”是文本中的主键吗?因为如果是这样,数据库本身可能会将其用作索引机制之类的东西,因此它将自动按字母顺序排序。不太确定很难,如果这符合您的情况,请尝试使用一些自动增量 ID 作为主键。 【参考方案1】:

您只能订购整个结果。

这意味着您必须引入一个虚拟列才能将记录与子查询区分开来:

SELECT *, 0 AS SubQueryNr FROM TableName WHERE column_name LIKE ?
UNION ALL
SELECT *, 1               FROM TableName WHERE column_name NOT LIKE ?
ORDER BY SubQueryNr, column_name

或者,只需使用LIKE 条件进行排序:

SELECT * FROM TableName
ORDER BY column_name LIKE ? DESC

【讨论】:

感谢您的建议。我们将服务器中的数据从我们获取数据的位置排序到数据库。所以不需要对查询进行排序。再次感谢您的帮助

以上是关于如何使用 SQLite 使用 UNION ALL 和 ORDER BY 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

水平 UNION ALL

如何使用 Union all 获得两列结果

如何在 LINQ 中使用 union all?

如何在 union all 中使用 order by

union 与 union all 的表现

SQLite:如何优化 UNION 查询