对自定义顺序中包含字母和符号的值进行排序

时间:2015-03-02 16:29:10

标签: mysql sql sorting

您可以按功能更改MySQL排序吗?我试图按照任意顺序对我的值进行排序。

目前正在寻找注入函数的方法,除了添加列和修改导入之外,这可能对我有所帮助。

这是我想要的订单:

AAA
AA+
AA
AA-
A+
A
A-
BBB+
BBB
BBB-
BB+
BB
BB-
B+
B
B-
CCC+
CCC
CCC-
CC

这是我使用sort by:

的结果
A
A+
A-
AA
AA+
AA-
AAA
B
B+
B-
BB
BB+
BB-
BBB
BBB+
BBB-
C
CC
CCC
CCC+
CCC-

编辑: 尝试但得到语法错误:

CREATE FUNCTION sortRating (s CHAR(20))
RETURNS INT(2)
DECLARE var INT
CASE s
    WHEN 'AAA' THEN SET var = 1
    WHEN 'AA+' THEN SET var = 2
    ELSE
        SET VAR = 3
END CASE
RETURN var
END;

2 个答案:

答案 0 :(得分:5)

可以使用以下语法:

ORDER BY FIELD(<field_name>, comma-separated-custom-order)

例如,如果您要排序的表达式名为rating,那么您的ORDER BY子句将为:

ORDER BY FIELD(rating, 'AAA', 'AA+', 'AA', 'AA-', 'A+', 'A', 'A-', 
                       'BBB+', 'BBB', 'BBB-', 'BB+', 'BB', 'BB-', 
                       'B+', 'B', 'B-', 'CCC+', 'CCC', 'CCC-', 'CC')

以下是FIELD FUNCTION

的文档

答案 1 :(得分:1)

我在这里看到一种模式:

BBB+
BBB
BBB-
BB+
BB
BB-
B+
B
B-

将每个字符视为一列,并按此顺序对每列进行排序:

  1. 字母
  2. +
  3. 空字符串
  4. -
  5. SELECT rating
    FROM test
    ORDER BY
             MID(rating, 1, 1),
        CASE MID(rating, 2, 1) WHEN '+' THEN 2 WHEN '' THEN 3 WHEN '-' THEN 4 ELSE 1 END, 
        CASE MID(rating, 3, 1) WHEN '+' THEN 2 WHEN '' THEN 3 WHEN '-' THEN 4 ELSE 1 END,
        CASE MID(rating, 4, 1) WHEN '+' THEN 2 WHEN '' THEN 3 WHEN '-' THEN 4 ELSE 1 END
    

    SQL Fiddle