我有大约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
?
提前致谢。
答案 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;进行比较。操作