[英]MySQL ORDER BY using a CASE statement?
我有一個MySQL表,其中包含一個包含VARCHAR數據的列。 數據可以是以下類型:
我需要從表中提取數據並對與該列匹配的數據進行排序,讓我們稱之為type
。 排序應如下:
首先,以“Q%”開頭的所有內容都要記住Q之后的整數也起作用(Q5應該在Q6之前)等。
以下是以“L%”開頭的所有內容,與上述邏輯相同。 緊隨其后的'W%'只是簡單的整數。
那么查詢是什么,尤其是我需要編寫的ORDER BY部分? 我嘗試了下面沒有錯誤但沒有按照我想要的順序排列項目,我無法弄清楚它背后的邏輯是什么:
SELECT * FROM table
ORDER BY
CASE type
WHEN type LIKE 'Q%' THEN 1
WHEN type LIKE 'L%' THEN 2
WHEN type LIKE 'W%' THEN 3
ELSE 4
END,
type ASC
我也嘗試使用FIELD(...)
但我認為它根本不考慮'Q%'之類的東西,盡管它既沒有出錯也沒有正確排序。
任何提示或想法?
這應該允許所需的訂購。
ORDER BY FIELD(LEFT(type,1), 'Q', 'L', 'W')
, CAST(type AS UNSIGNED)
, CAST(SUBSTRING(type, 2) AS UNSIGNED)
第一個確保那些字母按順序發生; 任何開始的事情都會提前訂購。 這是一個好處,因為您首先需要純數字,但如果沒有其他前綴,則可能會導致問題。
第二個可以確保數字字符串命令自己的數字(這樣你就不會得到像1, 11, 12, 100, 2
對於字母這通常會導致0(無排序)開頭的字符串;雖然它會定位下落不明前綴(如果存在)在大多數純數字之前。
第三部分與第二部分幾乎完全相同,但對於前綴字符串的數字部分有效。
應根據列的整數值對第二列進行排序:
SELECT `type`
FROM `table`
ORDER BY
CASE
WHEN `type` LIKE 'Q%' THEN 1
WHEN `type` LIKE 'L%' THEN 2
WHEN `type` LIKE 'W%' THEN 3
ELSE 4
END,
CASE
WHEN `type` LIKE 'Q%' THEN CONVERT(SUBSTRING(`type`, 2), SIGNED)
WHEN `type` LIKE 'L%' THEN CONVERT(SUBSTRING(`type`, 2), SIGNED)
WHEN `type` LIKE 'W%' THEN CONVERT(SUBSTRING(`type`, 2), SIGNED)
ELSE CONVERT(`type`, SIGNED)
END
好的..試試這個
如果您不希望在最終答案中按字段查看制造的訂單。
select
list-all-fields-here again-except the ordering field we derived...
from
(SELECT
CASE type
WHEN type LIKE 'Q%' THEN 1
WHEN type LIKE 'L%' THEN 2
WHEN type LIKE 'W%' THEN 3
ELSE 4
END as MYORDERCOL,
**list-all-fields-here vs a * **
FROM table
) as tmp
order by tmp.MYORDERCOL ASC
我通常避免使用*並且總是喜歡列出明確的字段以便清楚
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.