注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

Oracle将一列以,组合成的字符串显示为转换为多行显示  

2016-08-14 08:32:02|  分类: Oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Oracle将一列字符串转换为多行记录,这种情形在写一些特殊的sql脚本的时候可能需要使用,比如定义一个游标,这个游标并不是以实际表为准[类似于数组的概念],当然如果可以的话,还可以使用UNION来连接几行记录,不过总觉得那样会比较麻烦。原有代码例子如下:

declare
cursor cur is
select '593668.com' as site from dual
union
select '237h.com' as site from dual
union
select '9zfx.com' as site from dual;
...

将其改写为如下代码达成同样目的:

declare
cursor cur is
SELECT REGEXP_SUBSTR('593668.com,237h.com,9zfx.com', '[^,]+', 1, LEVEL, 'i') AS site FROM DUAL
CONNECT BY LEVEL <= LENGTH('593668.com,237h.com,9zfx.com') - LENGTH(REGEXP_REPLACE('593668.com,237h.com,9zfx.com', ',', ''))+1;
...

这里主要是利用connect by的循环作用,LEVEL根据相应的‘,’出现次数来做循环次数限制,再使用REGEXP_SUBSTR将相应的字段区截断分为一行记录。
这里附上REGEXP_SUBSTR函数说明如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier) __srcstr:需要进行正则处理的字符串 __pattern:进行匹配的正则表达式 __position:起始位置,从第几个字符开始正则表达式匹配(默认为1) __occurrence:标识第几个匹配组,默认为1 __modifier:模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)
是不是已经明白了,这里其实还可将如上语句调整简化:

declare
cursor cur is
SELECT REGEXP_SUBSTR('593668.com,237h.com,9zfx.com', '[^,]+', 1, LEVEL, 'i') AS site FROM DUAL
CONNECT BY LEVEL <= regexp_count('593668.com,237h.com,9zfx.com','[^,]+')+1;
...

这里使用regexp_count同样是为了获取到相应的满足正则表达式的字符串的个数,怎么样,这样写的话,有些SQL语句是不是就可以写得更简洁一些。
  评论这张
 
阅读(0)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018