2015-02-06 58 views
0

我有三種工件。我存儲在數據庫中的這些文物具有下列:如何從oracle數據庫獲取最新版本的工件

artifact_type varchar2(20) not null, 
artifact_version varchar2(40) not null, 
artifact_blob blob default empty_blob() 

的版本是店格式如下:3.0.0.0.0 有一個查詢,在這裏我不得不返回最新版本的神器。 max()不會爲varchar返回正確的結果。那麼,有沒有辦法找到這個版本格式的最大值,或者我應該以其他方式存儲版本,還是應該創建一個更像最新標誌的列。

+0

請勿在表格中添加額外的列。最新版本更改時數據不一致的風險太高。 (或者使用觸發器來確保始終有效的值。) – jarlh 2015-02-06 11:52:41

回答

2

這會給你每個artifact_type的最高版本,只要你只有數字和點(即不是3.0.2.1.1b或其他)。這是甲骨文12C

SELECT a.artifact_type, a.artifact_version, a.artifact_blob 
FROM 
    artifacts a 
WHERE a.artifact_version = 
(
SELECT b.artifact_version 
FROM 
    artifacts b 
WHERE b.artifact_type = a.artifact_type 
ORDER 
BY CAST(REGEXP_SUBSTR(b.artifact_version,'[^.]+',1, 1) AS NUMBER) DESC, 
    CAST(REGEXP_SUBSTR(b.artifact_version,'[^.]+',1, 2) AS NUMBER) DESC, 
    CAST(REGEXP_SUBSTR(b.artifact_version,'[^.]+',1, 3) AS NUMBER) DESC, 
    CAST(REGEXP_SUBSTR(b.artifact_version,'[^.]+',1, 4) AS NUMBER) DESC, 
    CAST(REGEXP_SUBSTR(b.artifact_version,'[^.]+',1, 5) AS NUMBER) DESC 
FETCH FIRST 1 ROWS ONLY 
) 
/

爲11g中,您將需要使用ROWNUM技巧來限制在子選擇僅第一行的行集。

0

您應該以另一種格式存儲版本。雖然你可以使用正則表達式來解析這個,但是一個零填充的版本號可以做你想做的。而不是3.0.0.0.0,使用003.000.000.000.000。這是更詳細的,但它允許訂單和比較。

如果你知道的版本將永遠有四個階段,那麼你可以做一個排序的東西,如:

order by cast(regexp_substr(artifact_version, '[0-9]{0.}.', 1, 1) as number), 
     cast(regexp_substr(artifact_version, '[0-9]{0.}.', 1, 2) as number), 
     cast(regexp_substr(artifact_version, '[0-9]{0.}.', 1, 3) as number), 
     cast(regexp_substr(artifact_version, '[0-9]{0.}.', 1, 4) as number), 
     cast(regexp_substr(artifact_version, '[0-9]{0.}.', 1, 5) as number) 

然後拉爲max()的第一要素。

1

作爲常用決定,您可以使用user-defined aggregate function

如果'最後一個版本'等於'插入的最後一行',則可以添加'插入日期'列並將其用於排序。有時可以使用其他輕量級方法。例如,如果您可以將版本格式設置爲'003.000.000.000',則varchar比較就足夠了。

0

選項1:您可以使用三個數字字段Major,Minor,Patch來存儲版本號。這將很容易分類,但你必須得到三個領域。

選項2:把它放在不同的表並將其顯示爲一個觀點:

Table tversion (
    major NUMBER(3), 
    minor NUMBER(3), 
    patch NUMBER(3) 
) 

View vversion is 
    select major || '.' || minor || '.' || patch AS version, 
     major * 1000000 + minor * 1000 + patch AS sortorder from tversion; 

方案3:保持你的數據庫模式是,把你的邏輯在客戶端,以獲得最大的版本。

相關問題