如何在SQL中将字符串排序为数字?

如何在SQL中将字符串排序为数字?,sql,mysql,oracle,sql-order-by,Sql,Mysql,Oracle,Sql Order By,谁能告诉我怎么解决这个问题吗?我的订单是按课程编号递增的(例如,CS 20、CS 25、CS 100都是课程编号)。它计算的是第一个数字,而不是整数: ----------------------------------------- Course Grade ----------------------------------------- CS 120 Intro to Java Programming A CS 140

谁能告诉我怎么解决这个问题吗?我的订单是按课程编号递增的(例如,CS 20、CS 25、CS 100都是课程编号)。它计算的是第一个数字,而不是整数:

-----------------------------------------
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

这里的问题是,您的数据库正在进行字符串排序,而不是数字排序。计算机将无法查看这些数据并推断语义排序顺序。字符串排序是通过获取两个字符串,并比较每个字符,直到一个字符出现在另一个字符之前。因此,在您的示例中,每个课程都以“CS”开头,但第4个字符是数字字符(与数字类型不同!)。“1”排序比“2”排序低,然后在“1”排序中,“2”排序比“4”排序低,依此类推


要解决此问题,您需要将课程号(“CS 020”)归零,或者需要一个单独的数字列,其中包含课程号以进行排序。

去掉非数字字符并使用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))
;