【问题标题】:Version compare版本比较
【发布时间】:2017-09-04 13:48:44
【问题描述】:

我有大约 2000 多个站点维护运行 Oracle11g 的内部应用程序的不同版本。

一个表有一个维护版本的参数。 COl_1 的值如5.2.4 or 6.86 or 7.2.0.1 等。我需要比较两个站点版本,如(site16.2.3 大于site2,可能是6.8)。数据类型是 Varchar2。

最简单的方法是什么?有什么内置的吗?根据结果​​,我必须执行一些插入和合并。

那么,如何在 oracle sql 查询中比较5.2.4 > 6.2.1.4

提前致谢。

【问题讨论】:

  • 您知道最大版本零件数吗?所以,我问点数?
  • 根据你的例子应该是 6.2.1.4 > 5.2.4 ?
  • 最多 3 个点。但有些会有 2 位数 (6.3.95)。是的,5.2.4 site2.col1?谢谢
  • 在正常使用中,6.8 版本会大于6.2.3,因为约定是尾随字符表示补丁(或其他),所以版本6.8 必须晚于6.2。显然,无论如何,人们已经涉足答案,但为了下次您提出问题时的参考,请确保您的示例正确、完整且一致。如果您的规则确实偏离了一般约定,这一点尤其重要。

标签: oracle plsql


【解决方案1】:

您可以使用以下查询将包含版本的字符串拆分为单独的部分,然后您可以对记录进行排序和比较。

SELECT x,
       to_number(regexp_substr( x, '\d+', 1, 1)) As x_1,
       to_number(regexp_substr( x, '\d+', 1, 2)) As x_2,
       to_number(regexp_substr( x, '\d+', 1, 3)) As x_3,
       to_number(regexp_substr( x, '\d+', 1, 4)) As x_4,
       to_number(regexp_substr( x, '\d+', 1, 5)) As x_5,
       to_number(regexp_substr( x, '\d+', 1, 6)) As x_6
FROM table123
order by 
    2 nulls first,
    3 nulls first,
    4 nulls first,
    5 nulls first,
    6 nulls first,
    7 nulls first

演示:http://sqlfiddle.com/#!4/60df0/4

|          X | X_1 | X_2 |    X_3 |    X_4 |    X_5 |    X_6 |
|------------|-----|-----|--------|--------|--------|--------|
|      1.1.1 |   1 |   1 |      1 | (null) | (null) | (null) |
|     1.1.15 |   1 |   1 |     15 | (null) | (null) | (null) |
|      2.7.1 |   2 |   7 |      1 | (null) | (null) | (null) |
|     2.7.10 |   2 |   7 |     10 | (null) | (null) | (null) |
|     3.1..1 |   3 |   1 |      1 | (null) | (null) | (null) |
|      4.1.1 |   4 |   1 |      1 | (null) | (null) | (null) |
|      6.4.2 |   6 |   4 |      2 | (null) | (null) | (null) |
|        9.1 |   9 |   1 | (null) | (null) | (null) | (null) |
|      9.1.2 |   9 |   1 |      2 | (null) | (null) | (null) |
|     9.1.10 |   9 |   1 |     10 | (null) | (null) | (null) |
| 10.1.1.2.4 |  10 |   1 |      1 |      2 |      4 | (null) |
|     15.1.3 |  15 |   1 |      3 | (null) | (null) | (null) |
|     21.1.1 |  21 |   1 |      1 | (null) | (null) | (null) |
|     23.1.2 |  23 |   1 |      2 | (null) | (null) | (null) |
|    23.1.10 |  23 |   1 |     10 | (null) | (null) | (null) |
|     30.1.1 |  30 |   1 |      1 | (null) | (null) | (null) |
|     31.1.1 |  31 |   1 |      1 | (null) | (null) | (null) |
|       41.1 |  41 |   1 | (null) | (null) | (null) | (null) |

【讨论】:

    【解决方案2】:

    您可以左填充主要、次要和补丁版本并将它们连接起来并比较总字符串:

    SELECT
      CASE
        WHEN lpad(regexp_substr( '6.2.1.4', '\d+', 1, 1),10,'0')
          ||lpad(regexp_substr( '6.2.1.4', '\d+', 1, 2),10,'0')
          ||lpad(regexp_substr( '6.2.1.4', '\d+', 1, 3),10,'0')
          ||lpad(regexp_substr( '6.2.1.4', '\d+', 1, 4),10,'0') < 
            lpad(regexp_substr( '5.2.4', '\d+', 1, 1),10,'0')
          ||lpad(regexp_substr('5.2.4', '\d+', 1, 2),10,'0')
          ||lpad(regexp_substr('5.2.4', '\d+', 1, 3),10,'0')
          ||lpad(regexp_substr( '5.2.4', '\d+', 1, 4),10,'0')
        THEN 'LESS'
        ELSE 'NOT LESS'
      END
    FROM dual;
    

    解决方案允许每个部分;主要版本、次要版本等最长为 10 位数字。当然你也可以使用更大的'>'操作符进行比较。

    【讨论】:

      猜你喜欢
      • 2022-11-11
      • 1970-01-01
      • 2011-10-18
      • 2013-09-06
      • 2011-03-01
      • 2023-04-05
      • 2010-09-07
      • 2014-10-09
      • 1970-01-01
      相关资源
      最近更新 更多