我通過使用多個 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 中為每個名稱啟動單獨的查詢,但是執行 100 個查詢而不是一個查詢確實效率低下。
uj5u.com熱心網友回復:
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
uj5u.com熱心網友回復:
您可以將搜索條件放在虛擬或真實表中,然后加入,然后按排序列排序
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/328793.html
標籤:sql sql-server sql-order-by 哪里
上一篇:SQLServer語法-使用in或like與逗號分隔的列
下一篇:使用SQL高效查詢節點和邊
