如何将两个 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 结合起来
是否可以在SQL中将SELECT函数与LAST函数结合使用?