按照自定义顺序排序包含字母和符号的值

3

你能更改MySQL的排序功能吗?我想根据任意顺序对我的值进行排序。

目前正在寻找注入可能有所帮助的函数的方法,而不是添加列并修改导入。

这是我想要的顺序:

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

这是使用排序功能后的结果:
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;

你的字符串开头只有字母吗? - Abhik Chakraborty
这组数值是有限的吗?如果是,创建一个带有指定等级值的查找表会是最容易的方法。 - Michael Berkowski
是的 - 值集合是有限的。我正在研究编写我的第一个存储过程,其中包含大量的case语句。@MichaelBerkowski - 你所说的查找表是什么意思? - ovatsug25
2个回答

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函数 的文档。

这个函数很棒!现在我只需要将这个字符串附加到一个zf2查询中。 :) - ovatsug25

1

我看到了一个模式:

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

把每个字符都看作是一列,按照以下顺序对每一列进行排序:

  1. 字母
  2. +
  3. 空字符串
  4. -
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

的含义是:SQL 小工具。

有趣!谢谢!其他功能比较简单,但这个相当棒且富有教育意义。 - ovatsug25

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接