如何在Oracle SQL中使用regexp_substr拆分字符串?

kpbwa7wx  于 2022-11-28  发布在  Oracle
关注(0)|答案(3)|浏览(215)
select  
regexp_substr('a-b--->d--->e f','[^--->]+',1,1) col1
,regexp_substr('a-b--->d--->e f','[^--->]+',1,2) col2
,regexp_substr('a-b--->d--->e f','[^--->]+',1,3) col3
,regexp_substr('a-b--->d--->e f','[^--->]+',1,4) col4
 from dual

输出功率
| 列1|第2列|第3列|第4列|
| - -|- -|- -|- -|
| 一种|最佳|日|e f|
所需输出
| 列1|第2列|第3列|第4列|
| - -|- -|- -|- -|
| a-b型|日|e f||

dgtucam1

dgtucam11#

您可以使用:

select regexp_substr(value,'(.*?)(-+>|$)',1,1, NULL, 1) AS col1
,      regexp_substr(value,'(.*?)(-+>|$)',1,2, NULL, 1) AS col2
,      regexp_substr(value,'(.*?)(-+>|$)',1,3, NULL, 1) AS col3
,      regexp_substr(value,'(.*?)(-+>|$)',1,4, NULL, 1) AS col4
 from  table_name

或者,如果您要查找固定分隔符字符串--->,则可以使用简单的字符串函数(键入更多内容,但可能会快得多):

SELECT CASE
       WHEN pos1 = 0 THEN value
                     ELSE SUBSTR(value, 1, pos1 - 1)
       END AS col1,
       CASE
       WHEN pos1 = 0 THEN NULL
       WHEN pos2 = 0 THEN SUBSTR(value, pos1 + 4)
                     ELSE SUBSTR(value, pos1 + 4, pos2 - pos1 - 4)
       END AS col2,
       CASE
       WHEN pos2 = 0 THEN NULL
       WHEN pos3 = 0 THEN SUBSTR(value, pos2 + 4)
                     ELSE SUBSTR(value, pos3 + 4, pos3 - pos2 - 4)
       END AS col3,
       CASE
       WHEN pos3 = 0 THEN NULL
                     ELSE SUBSTR(value, pos3 + 4)
       END AS col4
FROM   (
  SELECT value,
         INSTR(value, '--->', 1, 1) AS pos1,
         INSTR(value, '--->', 1, 2) AS pos2,
         INSTR(value, '--->', 1, 3) AS pos3
  FROM   table_name
)

其中,对于示例数据:

CREATE TABLE table_name (value) AS
SELECT 'a-b--->d--->e f' FROM DUAL;

两者输出:
| COL1| COL 2系统|COL3| COL4|
| - -|- -|- -|- -|
| a-b型|日|e f| * 空值 *|
fiddle

k75qkfdt

k75qkfdt2#

select  
 regexp_substr('a-b--->d--->e f','[a-z]+([ \-][a-z]+){0,1}',1,1) col1
,regexp_substr('a-b--->d--->e f','[a-z]+([ \-][a-z]+){0,1}',1,2) col2
,regexp_substr('a-b--->d--->e f','[a-z]+([ \-][a-z]+){0,1}',1,3) col3
,regexp_substr('a-b--->d--->e f','[a-z]+([ \-][a-z]+){0,1}',1,4) col4
 from dual
 ;

a-b d   e f (null)
ss2ws0br

ss2ws0br3#

[^--->]character set,因此没有必要在其中指定两次相同的字符。
一个有效的正则表达式是:

(-*[^->])+

它匹配不是连字符或带有任意数量可能的尾随连字符的>的任何字符,并且以贪婪的方式重复该模式。
观看here演示。

相关问题