簡體   English   中英

MySQL ORDER BY使用CASE語句?

[英]MySQL ORDER BY using a CASE statement?

我有一個MySQL表,其中包含一個包含VARCHAR數據的列。 數據可以是以下類型:

  • 簡單整數(1,2,3等)
  • 整數附加字母'L',例如(L1,L2等)
  • 整數附加字母'Q',例如(Q1,Q2等)
  • 整數附加字母'W',例如(W1,W2等)

我需要從表中提取數據並對與該列匹配的數據進行排序,讓我們稱之為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

SQL小提琴

好的..試試這個

如果您不希望在最終答案中按字段查看制造的訂單。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM