MySQL ORDER BY 使用 CASE 语句?
MySQL ORDER BY using a CASE statement?
我有一个 MySQL table,其中有一列包含 VARCHAR 数据。数据可以是以下类型:
- 简单整数(1、2、3 等)
- 整数后加字母'L',例如(L1、L2等)
- 后跟字母'Q'的整数,例如(Q1、Q2等)
- 整数后加字母'W',例如(W1、W2等)
我需要从 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
我有一个 MySQL table,其中有一列包含 VARCHAR 数据。数据可以是以下类型:
- 简单整数(1、2、3 等)
- 整数后加字母'L',例如(L1、L2等)
- 后跟字母'Q'的整数,例如(Q1、Q2等)
- 整数后加字母'W',例如(W1、W2等)
我需要从 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