当遇到特殊字符时,oracle查询将example@gmail.com拆分为列

时间:2016-02-29 05:02:15

标签: oracle

这里我已经编写了代码,但也包含了特殊字符。但是我的要求是要求用户动态发送电子邮件,并在发生特殊字符时拆分该电子邮件,但需要输出特殊字符。

col1     col2     col3  
------------------

example123  gmail   com
select substr('exapmle123@gmail.com',instr('example123@gmail.com','@'),instr('example123@gmail.com','.')) as col1 ,
     substr('exapmle123@gmail.com',1,instr('example123@gmail.com','@')) as col2,
     substr('exapmle123@gmail.com',instr('example123@gmail.com','.'),length('example123@gmail.com')) as col3 
     from dual;

1 个答案:

答案 0 :(得分:1)

我建议您使用REGEXP_SUBSTR分割字符串

方法1

在下面的示例中,每个新单词和行都有一行,而colnumber是结果集的一部分。我建议你使用这种方法,因为你事先无法知道单词/ colummns的数量

<强>查询1

with MyString  as
 (          select 'exapmle123@gmail.com' Str, 1 rnum from dual
  )
,pivot as (
  Select Rownum Pnum
  From dual
  Connect By Rownum <= 100   
  )
SELECT REGEXP_SUBSTR (ms.Str,'([[:alnum:]])+',1,pv.pnum), ms.rnum, pv.pnum colnum
  FROM MyString ms
      ,pivot pv
where REGEXP_SUBSTR (ms.Str,'([[:alnum:]])+',1,pv.pnum) is not null  

<强>结果1

REGEXP_SUBSTR(MS.STR       RNUM     COLNUM
-------------------- ---------- ----------
exapmle123                    1          1
gmail                         1          2
com                           1          3

方法2
如果你知道你将拥有多少单词/列,那么你可以使用

<强> QUERY2

with MyString  as
 (          select 'exapmle123@gmail.com' Str, 1 rnum from dual
  )
SELECT REGEXP_SUBSTR (ms.Str,'([[:alnum:]])+',1,1) col1, REGEXP_SUBSTR (ms.Str,'([[:alnum:]])+',1,2) col2, REGEXP_SUBSTR (ms.Str,'([[:alnum:]])+',1,3) col3
  FROM MyString ms

<强>结果2

COL1       COL2  COL
---------- ----- ---
exapmle123 gmail com