2015-02-06 102 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:保持你的数据库模式是,把你的逻辑在客户端,以获得最大的版本。

相关问题