MySQL ORDER BY 使用 CASE 语句?

MySQL ORDER BY using a CASE statement?

我有一个 MySQL table,其中有一列包含 VARCHAR 数据。数据可以是以下类型:

我需要从 table 中提取数据并对匹配该列的数据进行排序,我们称之为 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%' 之类的东西,尽管它既没有给出错误也没有正确排序它们。

有任何提示或想法吗?

好的..试试这个

这是如果您不想在最终答案中按字段查看制造顺序..

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

我通常避免使用 * 并且为了清楚起见总是喜欢列出显式字段

这应该允许所需的排序。

ORDER BY FIELD(LEFT(type,1), 'Q', 'L', 'W')
   , CAST(type AS UNSIGNED)
   , CAST(SUBSTRING(type, 2) AS UNSIGNED)

first one 确保这些字母按顺序出现;任何以其他方式开始的东西都会提前订购。这是一个好处,因为您首先需要纯数字,但如果没有考虑其他前缀,可能会导致问题。

第二个确保数字字符串按数字顺序排列(这样你就不会得到像 1, 11, 12, 100, 2 这样的东西)。对于以字母开头的字符串,这通常会导致 0(无排序);尽管它会定位 unaccounted对于大多数纯数字之前的前缀(如果存在)。

第三部分与第二部分几乎相同,但对前缀字符串的数字部分有效。

第二列应根据列的整数值排序:

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 Fiddle