2011-01-10 66 views
1

問:如何訂購串邏輯

我有以下情況:

組字母(等級) A,A +,A-,B,B +,B-存儲爲字符串在 所述的數據庫我想訂購這些 等級從小 一個大一個邏輯 ,,但這不 什麼真正發生..因爲這些 都是字符串的順序是:

A,A +,A - 我唔NNA

ASC

A-,A,A +

DESC

A +,A,A-

我結合這些成績在下拉列表中 ,我想這些成績與這 邏輯順序吧..

是否有任何想法如何做 這樣。

回答

10

保持一個單獨的表,其中列出的檔次和什麼樣的順序,他們應該去:

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

那麼你的選擇查詢可以對該表和ORDER BY SortOrder執行INNER JOIN

+0

也許,使用enum來解決這個問題,確實很容易實現排序 – 2011-01-10 17:36:03

5

將成績轉換爲數字表示,然後對其進行排序。

1

使用數字代表級別

或過載比較操作

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; 
} 
+1

您需要的位移小於0.5(0.3?),否則A-和B +將相等。 – 2011-01-10 15:19:20

1

這裏是含校級表(表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 
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 
1

你可以使用枚舉對於這個問題,所以你可以進行排序更容易。