2011-01-10 11 views
1

Q:wie Zeichenfolge, um logisch

Ich habe den folgenden Fall:

Satz von Buchstaben (grad) A, A +, A-, B, B +, B- als Strings gespeichert in die logisch aus dem kleinen ein in den großen einer Datenbank ich will diese Noten bestellen ,, aber nicht was real passiert .. weil diese Strings sind die Reihenfolge ist:

A, A +, A - Ich wa NNA

ASC

A-, A, A +

DESC

A +, A, A-

I binden diese Noten in Dropdown-Liste und ich will diese Typen mit diese logische Reihenfolge in ..

gibt es eine Idee, wie man etwas tun so. .

Antwort

10

eine separate Tabelle halten, die die Qualitäten und welche Reihenfolge auflistet sie gehen sollten:

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

dann Ihre Auswahlabfrage können Machen Sie eine INNER JOIN zu dieser Tabelle und ORDER BY SortOrder.

+0

Vielleicht wäre es mit einer Enum für diese Angelegenheit sehr einfach, eine Art zu implementieren –

5

Konvertieren Sie die Noten in eine numerische Darstellung und sortieren Sie danach.

1

Verwenden Zahlen, die Qualitäten

oder Überlastung Vergleichsoperatoren

2

Sehr grobe Umsetzung:

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

Sie benötigen ein bisschen weniger als 0,5 für die Verschiebung (0,3?), Sonst A- und B + werden gleich. –

+0

Netter Fang, editting jetzt – Rob

1

Hier ist eine SQL-Select-Anweisung für eine Tabelle (Tabelle 1) ein Feld Grad enthält.

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

Hier ist eine Arbeitslösung:

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] 

Ausgang:

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

Sie Verwendung von Enumeratoren für diese Angelegenheit machen könnte, so das Sie könnten leichter sortieren.

Verwandte Themen