如何将两个 SELECT 查询与它们自己的顺序结合起来

Posted

技术标签:

【中文标题】如何将两个 SELECT 查询与它们自己的顺序结合起来【英文标题】:How to combine two SELECT queries with their own order 【发布时间】:2013-06-20 14:17:26 【问题描述】:

我有两个 SELECT 查询。它们是自行排序的。我想把它们合二为一,同时不改变它们的顺序。

例如,第一个 SELECT 查询是这样的:

SELECT * FROM table WHERE name LIKE "Smith%" ORDER BY name

这会返回

name
--------
SmithABC
SmithBCD
SmithDEF

我还有另一个这样的 SELECT 查询:

SELECT * FROM table WHERE name LIKE "%Smith%" AND name NOT LIKE "Smith%" ORDER BY name

这个返回

name
--------
ABCSmithEF
DEFSmithGH
XYZSmithXY

期望的结果:

name
--------
SmithABC
SmithBCD
SmithDEF
ABCSmithEF
DEFSmithGH
XYZSmithXY

按这个顺序

如果这在一个带有一些复杂 ORDER BY 的 SELECT 查询中是可能的,那很好。我想要的是,只需按照上面的顺序将它们变成 one 结果。

【问题讨论】:

【参考方案1】:

一般解决方案:使用UNION:

SELECT table.*, 1 subquery FROM table 
WHERE name LIKE 'Smith%'
UNION ALL
SELECT table.*, 2 subquery FROM table 
WHERE name LIKE '%Smith%' AND name NOT LIKE 'Smith%'
ORDER BY subquery, name

为了保留select语句的顺序,可以引入一个人工列,先排序,再按name排序

具体解决方案:使用更复杂的ORDER BY表达式:

在您的示例中,由于您的谓词,这两个子查询实际上是互斥的。所以你也可以写

SELECT * FROM table 
WHERE name LIKE '%Smith%'
ORDER BY CASE WHEN name LIKE 'Smith%' THEN 1 ELSE 2 END, name

注意:

虽然SQLite accepts double quotes " 作为字符串分隔符,但我强烈建议使用单引号',因为大多数数据库(包括SQLite)使用双引号来分隔区分大小写的标识符。

【讨论】:

以上是关于如何将两个 SELECT 查询与它们自己的顺序结合起来的主要内容,如果未能解决你的问题,请参考以下文章

SQL 将 COUNT 和 AVG 查询与 SELECT 结合起来

如何使用 Pandas 将查询与单个外部变量结合起来

是否可以在SQL中将SELECT函数与LAST函数结合使用?

MySql如何将LEFT JOIN查询与NOT IN查询结合起来

比较 Hive 查询与不同连接顺序的效率

在 db2 中合并两个 select 语句的结果