给定一个字符串.分割转换成行,有什么好的方法吗..求大神

sangfox 2014-09-14 11:15:30
t1|t2&t3|t4


column1 column2
t1 t2
t3 t4

这么晚了有大婶不..
...全文
299 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bw555 2014-09-15
  • 打赏
  • 举报
回复
SQL> select REGEXP_SUBSTR(REGEXP_SUBSTR(str, '[^&]+', 1, LEVEL), '[^|]+', 1, 1)
column1,
  2  REGEXP_SUBSTR(REGEXP_SUBSTR(str, '[^&]+', 1, LEVEL), '[^|]+', 1, 2) column2

  3    from (select 't1|t2'||'&'||'t3|t4' str from dual)
  4  CONNECT BY LEVEL <= REGEXP_COUNT(str, '&') + 1;

COLUMN1                COLUMN2
---------------------- ----------------------
t1                     t2
t3                     t4

SQL>
刚刚的测试结果,字符串中的&会被转义,'t1|t2'||'&'||'t3|t4' ,正则表达式中没啥问题
bw555 2014-09-15
  • 打赏
  • 举报
回复
刚去试了下,在sqlplus环境中确实有问题,我当时是在.net开发的工具中测试的
bw555 2014-09-15
  • 打赏
  • 举报
回复
引用 4 楼 rj0917 的回复:
[quote=引用 3 楼 bw555 的回复:] [quote=引用 2 楼 rj0917 的回复:] 你这个要转换成行其实很简单,麻烦一点就是要将&转换一下,不然就就将后面的当然变量输入,所以,如下即可。
with a as (select replace(('t1|t2'|| '&' || 't3|t4'),'&',',') id from dual)
select regexp_substr(id,'[^,]+',1,rownum) id from a
connect by rownum<=length(regexp_replace(id,'[^,]+'))+1
注意活学活用,别死记硬背
regexp_substr(id,'[^,]+',1,rownum)--是按逗号分隔
regexp_substr(id,'[^&]+',1,rownum)--就是按&分隔
没必要非得转化为逗号,再进行分隔 [/quote] 你确定你这样OK,你试了没?这样会让你输入变量好吧!!!![/quote] &是在引号里面的,在引号里面不会进行转义的,你到sql环境执行下就知道了
rj0917 2014-09-15
  • 打赏
  • 举报
回复
引用 3 楼 bw555 的回复:
[quote=引用 2 楼 rj0917 的回复:] 你这个要转换成行其实很简单,麻烦一点就是要将&转换一下,不然就就将后面的当然变量输入,所以,如下即可。
with a as (select replace(('t1|t2'|| '&' || 't3|t4'),'&',',') id from dual)
select regexp_substr(id,'[^,]+',1,rownum) id from a
connect by rownum<=length(regexp_replace(id,'[^,]+'))+1
注意活学活用,别死记硬背
regexp_substr(id,'[^,]+',1,rownum)--是按逗号分隔
regexp_substr(id,'[^&]+',1,rownum)--就是按&分隔
没必要非得转化为逗号,再进行分隔 [/quote] 你确定你这样OK,你试了没?这样会让你输入变量好吧!!!!
bw555 2014-09-15
  • 打赏
  • 举报
回复
引用 2 楼 rj0917 的回复:
你这个要转换成行其实很简单,麻烦一点就是要将&转换一下,不然就就将后面的当然变量输入,所以,如下即可。
with a as (select replace(('t1|t2'|| '&' || 't3|t4'),'&',',') id from dual)
select regexp_substr(id,'[^,]+',1,rownum) id from a
connect by rownum<=length(regexp_replace(id,'[^,]+'))+1
注意活学活用,别死记硬背
regexp_substr(id,'[^,]+',1,rownum)--是按逗号分隔
regexp_substr(id,'[^&]+',1,rownum)--就是按&分隔
没必要非得转化为逗号,再进行分隔
rj0917 2014-09-15
  • 打赏
  • 举报
回复
你这个要转换成行其实很简单,麻烦一点就是要将&转换一下,不然就就将后面的当然变量输入,所以,如下即可。
with a as (select replace(('t1|t2'|| '&' || 't3|t4'),'&',',') id from dual)
select regexp_substr(id,'[^,]+',1,rownum) id from a
connect by rownum<=length(regexp_replace(id,'[^,]+'))+1
bw555 2014-09-15
  • 打赏
  • 举报
回复
select REGEXP_SUBSTR(REGEXP_SUBSTR(str, '[^&]+', 1, LEVEL), '[^|]+', 1, 1) column1,
REGEXP_SUBSTR(REGEXP_SUBSTR(str, '[^&]+', 1, LEVEL), '[^|]+', 1, 2) column2
  from (select 't1|t2&t3|t4' str from dual)
CONNECT BY LEVEL <= REGEXP_COUNT(str, '&') + 1
REGEXP_COUNT函数11G之后才有,之前的版本可以这样写
select REGEXP_SUBSTR(REGEXP_SUBSTR(str, '[^&]+', 1, LEVEL), '[^|]+', 1, 1) column1,
REGEXP_SUBSTR(REGEXP_SUBSTR(str, '[^&]+', 1, LEVEL), '[^|]+', 1, 2) column2
  from (select 't1|t2&t3|t4' str from dual)
CONNECT BY LEVEL <= length(str)-length(replace(str, '&','')) + 1

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧