2010-12-05 5 views
2

Quelqu'un peut-il me dire comment résoudre ce problème? Ma commande par est par coursenum (par exemple, CS 20, CS 25, CS 100 sont tous les numéros de cours) ascendante. Il est compté le premier chiffre au lieu du nombre entier si:Comment trier les chaînes comme des nombres dans SQL?

----------------------------------------- 
Course        Grade 
----------------------------------------- 
CS 120 Intro to Java Programming  A 
CS 140 Structured Analysis    A 
CS 20 Intro to Computers    F 
CS 25 Intro to Programming    B 

Répondre

8

Le problème ici est que votre base de données est en train de faire une sorte de chaîne, plutôt que d'un tri numérique. Un ordinateur ne pourra pas regarder ces données et déduire un ordre de tri sémantique. Une sorte de chaîne est faite en prenant deux chaînes, et en comparant chaque caractère jusqu'à ce qu'un caractère arrive avant un autre. Donc, dans votre exemple, chacun de ces cours commence par "CS", mais alors le 4ème caractère est un caractère numérique (ce qui n'est pas la même chose qu'un type numérique!). le type "1" est plus bas que le "2", puis dans les "1", le "2" trie plus bas que le "4", et ainsi de suite.

Pour résoudre ce problème, vous devez soit mettre à zéro le numéro de cours ("CS 020"), soit vous avez besoin d'une colonne numérique distincte avec le numéro du cours à trier.

+0

Très bien, merci homme. Je garderai cela à l'esprit la prochaine fois que je concevrai une base de données. – OneSneakyMofo

4

Strip les caractères non-numériques et utiliser to_number(),

with t as (
select 'CS 120 Intro to Java Programming' course from dual 
union 
select 'CS 140 Structured Analysis' course from dual 
union 
select 'CS 20 Intro to Computers' course from dual 
union 
select 'CS 25 Intro to Programming' course from dual 
) 
select 
    course, regexp_replace(course, '[^0-9]', null) n 
from 
    t 
order by 
    to_number(regexp_replace(course, '[^0-9]', null)) 
; 

alt text

+0

Merci. Je vais essayer quand je rentre à la maison. – OneSneakyMofo

Questions connexes