使用正则表达式在Oracle中按定界符分割字符串

时间:2019-02-25 15:43:00

标签: regex oracle plsql

我需要在Oracle中编写脚本以在查询中按/字符拆分字符串'BP / 593/00294'和'NC // 12345',以在单独的列中包含值。

我在想类似的东西:

select regexp_substr(mystr, '[^/]+') as col1, 
regexp_substr(c.usertext21,'[^/]+',1,2) as col2
from mytable

但是在col2中,我从第二个字符串中释放了空字符串值。 我需要保留两个字符串中的每个值。结果应该是:

<table>
<th>col1</th>
<th>col2</th>
<th>col3</th>
<tr>
  <td>BP</td>
  <td>593</td>
  <td>00294</td>
</tr>
<tr>
  <td>NC</td>
  <td></td>
  <td>12345</td>
</tr>
</table>

任何帮助将不胜感激。 谢谢

2 个答案:

答案 0 :(得分:1)

您可以在字符串开头或/之后捕获/以外的0个或更多字符:

select 
  regexp_substr('BP/593/00294', '(^|/)([^/]*)') as col1,
  regexp_substr('BP/593/00294', '(^|/)([^/]*)', 1, 2, null, 2)  as col2,
  regexp_substr('BP/593/00294', '(^|/)([^/]*)', 1, 3, null, 2)  as col3
from dual

enter image description here

请参见online demo

详细信息

  • (^|/)-捕获组1:字符串或/的开头
  • ([^/]*)-捕获第2组:/以外的任何0个或更多字符。

请注意提取第2组值的2参数。参见regex demo

答案 1 :(得分:1)

如果要捕获的拆分数目未知,并且希望将每个拆分作为单独的行,则可以使用connect by子句:

with example as (
   select 'NC//12345/12qwe/////12sadf' text from dual
)
 select regexp_substr(e.text, '[^/]+', 1, LEVEL) col
   from example e
connect by regexp_instr(e.text, '[/]+', 1, LEVEL - 1) > 0

Demo