MySQL ORDER BY使用CASE语句?

时间:2015-12-24 19:41:53

标签: mysql sql sql-order-by

我有一个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%'之类的东西,尽管它既没有出错也没有正确排序。

任何提示或想法?

3 个答案:

答案 0 :(得分:4)

这应该允许所需的订购。

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(没有排序);尽管它会定位为未计数对于前缀(如果它们存在),在大多数纯数字之前。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

好的..试试这个

如果您不希望在最终答案中按字段查看制造的订单..

xs

我通常避免使用*并且总是希望列出明确的字段以便清晰