问:
我有以下情况:
一组字母(成绩) A,A +,A-,B,B +,B-作为字符串存储 数据库我想订购这些 成绩逻辑从小 一个到大的,但这不是 真实发生的事情......因为这些 是订单的字符串:
A,A +,A-我想
ASC
A-,A,A +
DESC
A +,A,A -
我在下拉列表中绑定这些成绩 我希望这些成绩 它的逻辑顺序..
有任何想法如何做某事 喜欢这个..
答案 0 :(得分:10)
保留一个单独的表格,其中列出了成绩以及应该采用的顺序:
Grade | SortOrder
B- | 20
B | 30
B+ | 40
A- | 50
A | 60
A+ | 70
然后,您的选择查询可以对此表格INNER JOIN
和ORDER 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)
你可以使用枚举器,这样你就可以更轻松地进行排序。