我的数据来自DB。我想在"。"之后得到最后的数字。例如,数据看起来像这样,其中最后一个数字是#34;。"是160410,6,16等。
我想得到" 11.2.0.4.160419"输出
11.2.0.4.160419
11.2.0.4.6
11.2.0.4.16
11.2.0.4.10
11.2.0.4.18
11.2.0.4.2
11.2.0.4.14
11.2.0.4.4
11.2.0.4.160119
11.2.0.4.3
11.2.0.4.15
11.2.0.4.9
11.2.0.4.17
11.2.0.4.8
11.2.0.4.5
11.2.0.4.7
11.2.0.4.1
11.2.0.4.151117
11.2.0.4.13
11.2.0.4.12
11.2.0.4.20
11.2.0.4.11
11.2.0.4.19
"之前的数据。"不一样。它有各种价值观。事实上,实际数据就像这样
DATABASE PATCH FOR EXADATA (JAN 2016 - 11.2.0.4.160119) : (22309110)
DATABASE PATCH FOR EXADATA (JAN 2016 - 11.2.0.4.16) : (22309111)
.
.
在此我有兴趣获得最大值160119.
- 已添加</ p>
抱歉,我又回来了。我们正在寻找进一步的地方,我们需要得到这样的结果
11.2.0.4.160419
意思是,&#34;之后的最大值。&#34; ,但是当显示括号之间的所有内容时
实际数据
&#39;数据库补丁程序补丁(2015年11月 - 11.2.0.4.151117)
EXADATA数据库补丁(APR2014 - 11.2.0.4.6):( 18293775)
EXADATA的数据库补丁(APR2015 - 11.2.0.4.16):( 20449729)
期望的输出
(NOV 2015 - 11.2.0.4.151117)
我有这个查询工作
与
输入(target_guid,description)为(
选择t.target_guid,a.description from MGMT $ OH_PATCH a,mgmt $ oh_installed_targets oh,MGMT $ TARGET_COMPONENTS c,MGMT $ TARGET_FLAT_MEMBERS d,mgmt_targets t其中t.target_type =&#39; oracle_dbmachine&#39;和d.member_target_type =&#39;主持人&#39;和d.aggregate_target_guid = t.target_guid和c.target_type =&#39; oracle_database&#39;和c.host_name = d.member_target_name和a.host_name = c.host_name和a.target_guid = oh.oh_target_guid和oh.inst_target_type喜欢&#39;%database%&#39;和a.description不是null和a.description喜欢&#39;%PATCH FOR EXADATA%&#39; t.target_guid分组,t.target_guid命令分组
)
选择target_guid,max(to_number(regexp_substr(description,&#39;。(\ d *))&#39;,1,1,null,1)))作为版本
来自输入组by target_guid;
与输出
5DA0496CCCD42CA1099F1AD06216F3C0 160419
ED10DD7D4C62CEAA117E7B7E97883EC2 9
我需要输出为
5DA0496CCCD42CA1099F1AD06216F3C0 11.2.0.4.160419
ED10DD7D4C62CEAA117E7B7E97883EC2 11.2.0.4.9
你能帮忙吗?
答案 0 :(得分:0)
您可以使用以下方式提取最后的数字:
select regexp_substr(col, '[0-9]+$', 1, 1)
如果你不喜欢依赖Oracle正则表达式的贪婪(我可以欣赏),你可以使用:
select trim(leading '.' from regexp_substr(col, '[.][0-9]+$', 1, 1))
您可以通过转换为数字并获取最大值来获得最大值:
select max(cast(regexp_substr(col, '[0-9]+$', 1, 1) as number))
获取完整列:
select t.*
from (select t.*
from t
order by cast(regexp_substr(col, '[0-9]+$', 1, 1) as number) desc
) t
where rownum = 1;
最后,对于您的特定数据,有一个更简单的解决方案:
select t.*
from (select t.*
from t
order by length(col) desc, col desc
) t
where rownum = 1;
但是,这假设最终'.'
之前的所有内容都是相同的。
答案 1 :(得分:0)
如果我在对原始问题的评论中详述的假设是正确的,那么这样的事情应该有效:
inp_str
select语句实际上只是最后两行;其余的是用于测试目的。将inputs
替换为您的实际列名,max_something
替换为您的表名,将with
inputs ( inp_str ) as (
select 'DATABASE PATCH FOR EXADATA (JAN 2016 - 11.2.0.4.160119) : (22309110)'
from dual union all
select 'DATABASE PATCH FOR EXADATA (JAN 2016 - 11.2.0.4.16) : (22309111)' from dual
)
select regexp_substr(inp_str, '\(([^)]+)\)', 1, 1, null, 1) as token
from inputs
where to_number(regexp_substr(inp_str, '.(\d*)\)', 1, 1, null, 1)) =
( select max(to_number(regexp_substr(inp_str, '.(\d*)\)', 1, 1, null, 1)))
from inputs
)
;
替换为您想要的输出列名。
编辑:
以下是OP重述问题的解决方案(请参阅评论中的请求)。
TOKEN
-------------------------
JAN 2016 - 11.2.0.4.160119
1 row selected.
<强>输出强>:
MAX(ash.id)
答案 2 :(得分:-1)
也许请查看Oracle regexp_like,例如WHERE REGEXP_LIKE(first_name, EXPRESSION)