Sql 如何从oracle数据库获取工件的最新版本

Sql 如何从oracle数据库获取工件的最新版本,sql,oracle,Sql,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返回正确的结果。那么,有没有办法找到此版本格式的最大值,或者我应该以其他方式存储版本,或者我应该

我有三种人工制品。我使用以下列将这些工件存储在数据库中:

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返回正确的结果。那么,有没有办法找到此版本格式的最大值,或者我应该以其他方式存储版本,或者我应该创建一个类似于最新标志的列。

您应该以其他格式存储版本。尽管您可以使用正则表达式来解析它,但零填充版本号可以满足您的需要。使用003.000.000.000.000.000代替3.0.0.0。这更详细,但它允许排序和比较

如果您知道版本总是有四个句点,那么您可以使用以下内容进行排序:

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()
的第一个元素,您应该以另一种格式存储版本。尽管您可以使用正则表达式来解析它,但零填充版本号可以满足您的需要。使用003.000.000.000.000.000代替3.0.0.0。这更详细,但它允许排序和比较

如果您知道版本总是有四个句点,那么您可以使用以下内容进行排序:

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()
的第一个元素,您应该以另一种格式存储版本。尽管您可以使用正则表达式来解析它,但零填充版本号可以满足您的需要。使用003.000.000.000.000.000代替3.0.0.0。这更详细,但它允许排序和比较

如果您知道版本总是有四个句点,那么您可以使用以下内容进行排序:

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()
的第一个元素,您应该以另一种格式存储版本。尽管您可以使用正则表达式来解析它,但零填充版本号可以满足您的需要。使用003.000.000.000.000.000代替3.0.0.0。这更详细,但它允许排序和比较

如果您知道版本总是有四个句点,那么您可以使用以下内容进行排序:

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

的第一个元素,这是一个常见的决定,您可以使用


如果“last version”等于“last row inserted”,则可以添加“insertion date”列并将其用于订购。有时可以使用其他轻量级方法。例如,如果您可以将版本格式化为“003.000.000.000”,varchar比较就足够了。

作为一个常见的决定,您可以使用


如果“last version”等于“last row inserted”,则可以添加“insertion date”列并将其用于订购。有时可以使用其他轻量级方法。例如,如果您可以将版本格式化为“003.000.000.000”,varchar比较就足够了。

作为一个常见的决定,您可以使用


如果“last version”等于“last row inserted”,则可以添加“insertion date”列并将其用于订购。有时可以使用其他轻量级方法。例如,如果您可以将版本格式化为“003.000.000.000”,varchar比较就足够了。

作为一个常见的决定,您可以使用


如果“last version”等于“last row inserted”,则可以添加“insertion date”列并将其用于订购。有时可以使用其他轻量级方法。例如,如果您可以将版本格式化为“003.000.000.000”,varchar比较就足够了。

选项1:您可以使用三个数字字段,主要、次要和修补程序来存储版本号。这将很容易排序,但您必须获得三个字段

选项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:保持数据库模式不变,并将逻辑放在客户端以获得最大版本。

选项1:您可以使用三个数字字段,主要、次要和修补程序来存储版本号。这将很容易排序,但您必须获得三个字段

选项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:保持数据库模式不变,并将逻辑放在客户端以获得最大版本。

选项1:您可以使用三个数字字段,主要、次要和修补程序来存储版本号。这将很容易排序,但您必须获得三个字段

选项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:保持数据库模式不变,并将逻辑放在客户端以获得最大版本。

选项1:您可以使用三个数字字段,主要、次要和修补程序来存储版本号。这将很容易排序,但您必须获得三个字段

选项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:保持数据库模式不变,并将逻辑放在客户端以获得最大版本。

这将为每个
工件类型提供最高版本,前提是您只有数字和点(即不是3.0.2.1.1b或其他内容)。这是针对Oracle 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技巧将子选择中的行集限制为仅第一行。

这将为每个
工件类型提供最高版本,前提是您只有数字和点(即不是3.0.2.1.1b或其他)。这是针对Oracle 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技巧将子选择中的行集限制为仅第一行。

这将为每个
工件类型提供最高版本,前提是您只有数字和点(即不是3.0.2.1.1b或其他)。这是针对Oracle 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技巧将子选择中的行集限制为仅第一行。

这将为每个
工件类型提供最高版本,前提是您只有数字和点