簡體   English   中英

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

[英]How to split string words with regexp_substr in Oracle SQL?

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

output

col1 列2 列3 列4
一種 b d 有效

必填 output

col1 列2 列3 列4
ab d 有效

[^--->]是一個字符集,所以在其中指定兩次相同的字符是沒有意義的。

一個工作的正則表達式是:

(-*[^->])+

它匹配任何不是連字符或>的字符以及任意數量的可能尾隨連字符,並且以貪婪的方式重復該模式。

在此處查看演示。

您可以使用:

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;

兩者都是 output:

列1 列2 列3 列4
ab d 有效 null

小提琴

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM