版本比较

时间:2017-09-03 13:00:53

标签: oracle plsql

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

表有一个维护版本的参数。 COl_1的值为5.2.4 or 6.86 or 7.2.0.1等。我需要比较两个网站版本,如6.2.3 site1大于site2,可能是6.8。数据类型为Varchar2。

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

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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位数。当然,您也可以使用更大的&#39;&gt;&#39;进行比较。操作