[英]Oracle SQL to Sort Version Numbers
在Oracle中,僅使用ORDER BY
不會對版本號進行排序。 我的Version_Number
字段被聲明為VARCHAR
,我無法更改它。 例如:以下版本:
1.20
1.9
1.18
1.13
1.5
1.11
2.0
1.8
1.3
1.2
1.1
1.0
1.10
應排序為
2.0
1.20
1.18
1.13
1.11
1.10
1.9
1.8
1.5
1.3
1.2
1.1
1.0
我已經研究了幾個帖子但是它們似乎都沒有真正服務於我的目的,或者答案是針對SQL Server等而不是Oracle。 我遇到了這個特殊的sql,它似乎看起來很有效。
select version_number from mytable
order by lpad(version_number, 4) desc;
以這種方式對版本進行排序:
1.20
1.18
1.13
1.11
1.10
2.0
1.9
1.8
1.5
1.3
1.2
1.1
1.0
我相信這個sql語句適用於SQL Server
:
select version_number from mytable
order by cast ('/' + replace(version_number , '.', '/') + '/' as hierarchyid) desc;
但是,這不適用於Oracle。 Oracle中是否有hierarchyid的替代方案?
是否有人能夠提出SQL來准確地對這些版本進行排序?
我已經看過下面提到的帖子(鏈接附件)。 所以請不要告訴我這篇文章是重復的。
SQL按版本“number”排序,這是一個長度不一的字符串
如何使用SQL Server查詢對“版本號”列進行排序
Sql Server中的版本號排序
mysql排序版本號
還有很多。
這是一種方法。 先按順序排序.
然后是之后的數字.
select version_number
from mytable
order by substr(version_number, 1, instr(version_number,'.')-1) desc
,length(substr(version_number, instr(version_number,'.')+1)) desc
,substr(version_number, instr(version_number,'.')+1) desc
此SQL支持您的輸入數據以及任何包含的Revision或Build數字。
with
inputs as (select '1.20' as version_number from dual union all
select '1.9' as version_number from dual union all
select '1.18' as version_number from dual union all
select '1.13' as version_number from dual union all
select '1.5' as version_number from dual union all
select '1.11' as version_number from dual union all
select '2.0' as version_number from dual union all
select '1.8' as version_number from dual union all
select '1.3' as version_number from dual union all
select '1.2' as version_number from dual union all
select '1.1' as version_number from dual union all
select '1.0' as version_number from dual union all
select '1.10' as version_number from dual union all
select ' 3.1 ' as version_number from dual union all
select '3.1.1000' as version_number from dual union all
select '3.1.1' as version_number from dual union all
select '3.1.100' as version_number from dual union all
select '3.1.2.1000' as version_number from dual union all
select '3.1.2.1' as version_number from dual union all
select '3.1.2.100 ' as version_number from dual)
,versions as (select trim(version_number) as version_number,
nvl(LPAD(trim(regexp_substr(version_number, '[^.]+', 1, 1)),5,'0'),'00000') AS Major,
nvl(LPAD(trim(regexp_substr(version_number, '[^.]+', 1, 2)),5,'0'),'00000') AS Minor,
nvl(LPAD(trim(regexp_substr(version_number, '[^.]+', 1, 3)),5,'0'),'00000') AS Revision,
nvl(LPAD(trim(regexp_substr(version_number, '[^.]+', 1, 4)),5,'0'),'00000') AS Build
from inputs
ORDER BY Major desc, Minor desc, Revision desc, Build desc)
--select * from versions;
select version_number from versions;
刪除 - 以查看中間結果。
對於OP,將“input as(select ... from dual)”替換為:
inputs as (select version_number from mytable)
正如Joel Coehoorn 在此提出的建議,“重構版本號存儲使每個部分都有自己的列:MajorVersion,MinorVersion,Revision,Build”。
我正在重新發帖,因為我發現這非常有幫助!
為了擴展,我希望獲得MAX
版本號,並最終使用此腳本以及Joel的建議。
-- GET MAX VERSION NUMBER
SELECT
REPLACE(vnum, ' ', '') AS versionum
FROM
(SELECT
MAX(LPAD(major, 4) || '.' || LPAD(minor, 4) || '.' || LPAD(revision, 4)) AS vnum
FROM
my_table
ORDER BY
major
, minor
, revision
) tbl1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.