如何逻辑地命令字符串

时间:2011-01-10 12:16:15

标签: c# asp.net sql-server string data-structures

问:

我有以下情况:

一组字母(成绩)    A,A +,A-,B,B +,B-作为字符串存储    数据库我想订购这些    成绩逻辑从小    一个到大的,但这不是    真实发生的事情......因为这些    是订单的字符串:

A,A +,A-我想

ASC

A-,A,A +

DESC

A +,A,A -

我在下拉列表中绑定这些成绩    我希望这些成绩    它的逻辑顺序..

有任何想法如何做某事    喜欢这个..

7 个答案:

答案 0 :(得分:10)

保留一个单独的表格,其中列出了成绩以及应该采用的顺序:

Grade | SortOrder
B-    | 20
B     | 30
B+    | 40
A-    | 50
A     | 60
A+    | 70

然后,您的选择查询可以对此表格INNER JOINORDER BY SortOrder

答案 1 :(得分:5)

将成绩转换为数字表示,然后对其进行排序。

答案 2 :(得分:2)

非常粗略的实施:

public double getScore(String grade)
{
    grade = grade.ToUpper();
    if(grade.Length > 2 || grade.Length <= 0)
    {
        throw new ArgumentException();
    }
    var baseGrade = (double)grade[0];
    if(baseGrade < 65 || baseGrade > 90)
        throw new ArgumentException();

    if(grade.Length == 2)
    {
        var gradeShift = grade[1];
        switch(gradeShift)
        {
            case '+':
                baseGrade -= 0.3;
                break;
            case '-':
                baseGrade += 0.3;
                break;
            default:
                throw new ArgumentException();
        }
    }

    return baseGrade * -1 + 90.5;
}

答案 3 :(得分:1)

使用代表成绩的数字

或重载比较运算符

答案 4 :(得分:1)

这是包含字段Grade的表(Table1)的SQL select语句。

select Grade
from Table1
order by
    case Grade
        when 'A+' then 5
        when 'A'  then 4
        when 'A-' then 3
        when 'B+' then 2
        when 'B'  then 1
        when 'B-' then 0
        else -1     
    end asc

答案 5 :(得分:1)

这是一个有效的解决方案:

WITH ExamResults AS
(
    SELECT 1 ResultId, 'Joe Blow' Student, 'A-' Grade
    UNION ALL SELECT 2, 'Leroy Jones', 'B+'
    UNION ALL SELECT 3, 'Paul Smith', 'B-'
    UNION ALL SELECT 4, 'Helen Potter', 'B'
),
Suffix AS
(
    SELECT '+' Suffix, 1 [Rank]
    UNION ALL SELECT '', 2
    UNION ALL SELECT '-', 3
),
Grade AS
(
    SELECT DISTINCT Grade, LEFT(Grade, 1) Letter, SUBSTRING(Grade, 2, 1) Suffix
    FROM ExamResults
)
SELECT ExamResults.*,
    Grade.Letter,
    Grade.Suffix,
    Grade.Letter + CAST(Suffix.[Rank] AS char(1)) GradeOrder
FROM ExamResults
    JOIN Grade ON Grade.Grade = ExamResults.Grade
    JOIN Suffix ON Suffix.Suffix = Grade.Suffix
ORDER BY
    Grade.Letter,
    Suffix.[Rank]

输出:

ResultId    Student      Grade Letter Suffix GradeOrder
----------- ------------ ----- ------ ------ ----------
1           Joe Blow     A-    A      -      A3
2           Leroy Jones  B+    B      +      B1
4           Helen Potter B     B             B2
3           Paul Smith   B-    B      -      B3

答案 6 :(得分:1)

你可以使用枚举器,这样你就可以更轻松地进行排序。