如何在SQL中分离WHERE子句的重叠结果?



我通过使用多个WHERE子句条件在表中查找匹配的名称来搜索多人,然后根据名称在WHERE子句中出现的顺序对结果进行排序,如下所示:

SELECT * FROM table
WHERE table.NAME LIKE '%Alice%' OR
table.NAME LIKE '%Bob%' OR
table.NAME LIKE '%Charlie%'
ORDER BY CASE
WHEN table.NAME LIKE '%Alice%' THEN 1
WHEN table.NAME LIKE '%Bob%' THEN 2
WHEN table.NAME LIKE '%Charlie%' THEN 3
ELSE 4
END

我的问题是,如果我不小心搜索相同的名字两次(有重叠的结果)mySQL只返回记录一次,这打乱了我的数据排序和后来的后期处理。例如,下面的查询按顺序返回Alice、Bob和Charlie的结果,而我需要它按顺序返回Alice、Bob、Alice、Charlie的结果,即使两个Alice的结果是相同的。

SELECT * FROM table
WHERE table.NAME LIKE '%Alice%' OR
table.NAME LIKE '%Bob%' OR
table.NAME LIKE '%Alice%' OR
table.NAME LIKE '%Charlie%'
ORDER BY CASE
WHEN table.NAME LIKE '%Alice%' THEN 1
WHEN table.NAME LIKE '%Bob%' THEN 2
WHEN table.NAME LIKE '%Alice%' THEN 3
WHEN table.NAME LIKE '%Charlie%' THEN 4
ELSE 5
END

是否有可能在SQL中分离WHERE子句中每个子查询的结果?对于上下文,我需要使用pandas.read_sql()在Python中将结果返回到数据框中。我考虑过在Python中为每个名字启动单独的查询,但是执行100次查询而不是一次查询确实效率低下。

可以将搜索条件放在虚拟表或真实表中,然后连接,然后按排序列排序

SELECT t.*
FROM [table] t
JOIN (VALUES
(1, '%Alice%'),
(2, '%Bob%'),
(3, '%Alice%')
) v(order_position, search)
ON t.name LIKE v.search
ORDER BY v.order_position

SQL是集处理语言。您的FROM whatever WHERE whatever子句返回一组行。您的ORDER BY子句将结果集按您指定的顺序排序。

您正在寻找一种方法,使某些行在结果集中多次出现。如您所述,这需要多个查询,或者需要UNION ALL。

这样做可能会奏效。

SELECT *
FROM (
SELECT *, 1 order_position FROM table WHERE name LIKE '%Alice%'
UNION ALL
SELECT *, 2 order_position FROM table WHERE name LIKE '%Bob%'
UNION ALL
SELECT *, 3 order_position FROM table WHERE name LIKE '%Alice%'
) r
ORDER BY order_position

最新更新