1

我有两个 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 查询中是可能的,那很好。我想要的是,只需按照上面的顺序将它们变成一个结果。

4

1 回答 1

4

一般解决方案:使用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 接受双引号"作为字符串分隔符,但我强烈建议使用单引号',因为大多数数据库(包括 SQLite)使用双引号来分隔区分大小写的标识符。

于 2013-06-20T14:20:06.240 回答