在Oracle中,如何按混合了字符串和数字的字段排序?

在Oracle中,如何按混合了字符串和数字的字段排序?,oracle,Oracle,这些是要排序的字段(起重机编号)值 QC11QC10QC9 我尝试了以下查询: select * from table order by crane_no DESC 但是查询结果不按顺序给出,因为该字段混合了starting和number(例如:QC12)。 对于上述查询,我得到以下结果: QC9QC11QC10 我希望结果是有序的(QC9、QC10、QC11)。感谢一种方法是使用、转换为整数并按此值降序提取起重机编号列的数字部分 SELECT * FROM yourTable ORDER B

这些是要排序的字段(起重机编号)值
QC11
QC10
QC9

我尝试了以下查询:

select * from table order by crane_no DESC
但是查询结果不按顺序给出,因为该字段混合了starting和number(例如:QC12)。 对于上述查询,我得到以下结果:
QC9
QC11
QC10


我希望结果是有序的(QC9、QC10、QC11)。感谢

一种方法是使用、转换为整数并按此值降序提取
起重机编号
列的数字部分

SELECT *
FROM yourTable
ORDER BY CAST(SUBSTR(crane_no, 3) AS INT) DESC

请注意,我在回答中假设
crane\u no
中的每个条目都以固定宽度
QC
作为前缀。如果不是,那么我们将不得不做更多的工作来识别数字分量。

如果数据不是很大,我将使用regex order by子句:

select ...
order by to_number( substr( crane_no,3 )) desc
select 
  cran_no 
from your_table
order by 
  regexp_substr(cran_no, '^\D*') nulls first,
  to_number(regexp_substr(cran_no, '\d+'))

这将查找字符串中的数字,因此“QCC20”、“DCDS90”等行的顺序正确;它还处理空值

crane\u no
列中的每个条目是否都以两个字母开头
QC
?是的,它以两个字母开头QC@imsome1使用substring拆分字符串,并将第二个子字符串转换为numberThanks。对于此查询,它将给出预期的结果