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

How to separate overlapping results of WHERE clauses in SQL?

我通过使用多个 WHERE 子句条件在 table 中查找匹配的姓名来搜索多个人,然后根据姓名在 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 仅 return 记录一次,这会打乱我的数据排序和后来的 post 处理。例如,下面的查询 returns 结果是 Alice、Bob 和 Charlie 按顺序排列,而我需要它 return 结果是 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() return 结果到 Python 中的数据框。我考虑过为 Python 中的每个名称启动单独的查询,但是执行 100 个查询而不是一个查询确实效率低下。

SQL 是一种集合处理语言。您的 FROM whatever WHERE whatever 子句 return 一组行。您的 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

您可以将搜索条件放在虚拟或真实 table 中,然后加入,然后按排序栏排序

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