查找字符串

时间:2016-08-01 14:08:27

标签: sql oracle

我的数据来自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

你能帮忙吗?

3 个答案:

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