問:如何訂購串邏輯
我有以下情況:
組字母(等級) A,A +,A-,B,B +,B-存儲爲字符串在 所述的數據庫我想訂購這些 等級從小 一個大一個邏輯 ,,但這不 什麼真正發生..因爲這些 都是字符串的順序是:
A,A +,A - 我唔NNA
ASC
A-,A,A +
DESC
A +,A,A-
我結合這些成績在下拉列表中 ,我想這些成績與這 邏輯順序吧..
是否有任何想法如何做 這樣。
問:如何訂購串邏輯
我有以下情況:
組字母(等級) A,A +,A-,B,B +,B-存儲爲字符串在 所述的數據庫我想訂購這些 等級從小 一個大一個邏輯 ,,但這不 什麼真正發生..因爲這些 都是字符串的順序是:
A,A +,A - 我唔NNA
ASC
A-,A,A +
DESC
A +,A,A-
我結合這些成績在下拉列表中 ,我想這些成績與這 邏輯順序吧..
是否有任何想法如何做 這樣。
保持一個單獨的表,其中列出的檔次和什麼樣的順序,他們應該去:
Grade | SortOrder
B- | 20
B | 30
B+ | 40
A- | 50
A | 60
A+ | 70
那麼你的選擇查詢可以對該表和ORDER BY SortOrder
執行INNER JOIN
。
將成績轉換爲數字表示,然後對其進行排序。
使用數字代表級別
或過載比較操作
非常粗略的實現:
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;
}
您需要的位移小於0.5(0.3?),否則A-和B +將相等。 – 2011-01-10 15:19:20
這裏是含校級表(表1)一個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
這裏是一個有效的解決方案:
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
你可以使用枚舉對於這個問題,所以你可以進行排序更容易。
也許,使用enum來解決這個問題,確實很容易實現排序 – 2011-01-10 17:36:03