在oracle sql中使用(/)字符将单个varchar列值拆分为多个列

在oracle sql中使用(/)字符将单个varchar列值拆分为多个列,sql,oracle,oracle9i,Sql,Oracle,Oracle9i,原始的_列是 IVR时间=20130409200450CST/原因=FUL//Desc=TOD\u全天 我的结果是 select OVR_COMMENT, substr( OVR_COMMENT, 1, instr(OVR_COMMENT,'/')-1 ) Time, substr( OVR_COMMENT, instr(OVR_COMMENT,'/')+1, instr(OVR_COMMENT,'/',1,2)-instr(OVR_COMMENT,'/')-1 ) Reason,

原始的_列是

IVR时间=20130409200450CST/原因=FUL//Desc=TOD\u全天

我的结果是

  select OVR_COMMENT, 
 substr( OVR_COMMENT, 1, instr(OVR_COMMENT,'/')-1 ) Time, 
 substr( OVR_COMMENT, instr(OVR_COMMENT,'/')+1, instr(OVR_COMMENT,'/',1,2)-instr(OVR_COMMENT,'/')-1 ) Reason, 
 substr( OVR_COMMENT, instr(OVR_COMMENT,'/',1,3)+1 )  
 from  override  where wbu_name ='RVR'
我想要的实际结果

ROW | Val1                   | Val2              | Val3         | 
------------------------------------------------------------------
1    |RVR Time=20130409222756|Reason=FMLP|Desc=TOD_FULL_DAY     |
2    |RVR Time=20130409201134|Reason=FUL |Desc=TOD_FAMILY_LEAVE |

请帮我看看上面的结果。我尝试了substring的substring,但对我无效

您可以使用
regexp\u substr()
。这里有一种方法:

ROW | Val1          | Val2  | Val3         | 
------------------------------------------------------------------
1    |20130409222756|FMLP|TOD_FULL_DAY     |
2    |20130409201134|FUL |TOD_FAMILY_LEAVE |

您可以将
REGEXP\u SUBSTR
与模式
(^ |/)(.*)=([^/]*)
一起使用:

Oracle 11g R2架构设置

select x.*,
       regexp_substr(regexp_substr(col, 'IVR Time=[^/]*', 1, 1), '[^=]+', 1, 2), 
       regexp_substr(regexp_substr(col, 'Reason=[^/]*', 1, 1), '[^=]+', 1, 2), 
       regexp_substr(regexp_substr(col, 'Desc=[^/]*', 1, 1), '[^=]+', 1, 2)
from (select 'IVR Time=20130409200450CST/Reason=FUL//Desc=TOD_FULL_DAY' as col
      from dual
     ) x
CREATE TABLE override ( OVR_COMMENT ) AS
SELECT 'RVR Time=20130409200450CST/Reason=FUL/Desc=TOD_FULL_DAY' FROM DUAL UNION ALL
SELECT 'RVR Time=20130409201134/Reason=FUL/Desc=TOD_FAMILY_LEAVE' FROM DUAL
SELECT REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 1, NULL, 2 )
         AS key1,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 1, NULL, 3 )
         AS value1,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 2, NULL, 2 )
         AS key2,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 2, NULL, 3 )
         AS value2,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 3, NULL, 2 )
         AS key3,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 3, NULL, 3 )
         AS value3
FROM   override
SELECT SUBSTR( OVR_COMMENT, start1, end1 - start1 + 1 ) As value1,
       SUBSTR( OVR_COMMENT, start2, end2 - start2 + 1 ) As value2,
       SUBSTR( OVR_COMMENT, start3, end3 - start3 + 1 ) As value3
FROM   (
  SELECT OVR_COMMENT,
         INSTR( OVR_COMMENT, '=', 1, 1 ) + 1 AS start1,
         INSTR( OVR_COMMENT, '=', 1, 2 ) + 1 AS start2,
         INSTR( OVR_COMMENT, '=', 1, 3 ) + 1 AS start3,
         INSTR( OVR_COMMENT, '/', 1, 1 ) - 1 AS end1,
         INSTR( OVR_COMMENT, '/', 1, 2 ) - 1 AS end2,
         LENGTH( OVR_COMMENT ) AS end3
  FROM   override
)
查询1

select x.*,
       regexp_substr(regexp_substr(col, 'IVR Time=[^/]*', 1, 1), '[^=]+', 1, 2), 
       regexp_substr(regexp_substr(col, 'Reason=[^/]*', 1, 1), '[^=]+', 1, 2), 
       regexp_substr(regexp_substr(col, 'Desc=[^/]*', 1, 1), '[^=]+', 1, 2)
from (select 'IVR Time=20130409200450CST/Reason=FUL//Desc=TOD_FULL_DAY' as col
      from dual
     ) x
CREATE TABLE override ( OVR_COMMENT ) AS
SELECT 'RVR Time=20130409200450CST/Reason=FUL/Desc=TOD_FULL_DAY' FROM DUAL UNION ALL
SELECT 'RVR Time=20130409201134/Reason=FUL/Desc=TOD_FAMILY_LEAVE' FROM DUAL
SELECT REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 1, NULL, 2 )
         AS key1,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 1, NULL, 3 )
         AS value1,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 2, NULL, 2 )
         AS key2,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 2, NULL, 3 )
         AS value2,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 3, NULL, 2 )
         AS key3,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 3, NULL, 3 )
         AS value3
FROM   override
SELECT SUBSTR( OVR_COMMENT, start1, end1 - start1 + 1 ) As value1,
       SUBSTR( OVR_COMMENT, start2, end2 - start2 + 1 ) As value2,
       SUBSTR( OVR_COMMENT, start3, end3 - start3 + 1 ) As value3
FROM   (
  SELECT OVR_COMMENT,
         INSTR( OVR_COMMENT, '=', 1, 1 ) + 1 AS start1,
         INSTR( OVR_COMMENT, '=', 1, 2 ) + 1 AS start2,
         INSTR( OVR_COMMENT, '=', 1, 3 ) + 1 AS start3,
         INSTR( OVR_COMMENT, '/', 1, 1 ) - 1 AS end1,
         INSTR( OVR_COMMENT, '/', 1, 2 ) - 1 AS end2,
         LENGTH( OVR_COMMENT ) AS end3
  FROM   override
)

select x.*,
       regexp_substr(regexp_substr(col, 'IVR Time=[^/]*', 1, 1), '[^=]+', 1, 2), 
       regexp_substr(regexp_substr(col, 'Reason=[^/]*', 1, 1), '[^=]+', 1, 2), 
       regexp_substr(regexp_substr(col, 'Desc=[^/]*', 1, 1), '[^=]+', 1, 2)
from (select 'IVR Time=20130409200450CST/Reason=FUL//Desc=TOD_FULL_DAY' as col
      from dual
     ) x
CREATE TABLE override ( OVR_COMMENT ) AS
SELECT 'RVR Time=20130409200450CST/Reason=FUL/Desc=TOD_FULL_DAY' FROM DUAL UNION ALL
SELECT 'RVR Time=20130409201134/Reason=FUL/Desc=TOD_FAMILY_LEAVE' FROM DUAL
SELECT REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 1, NULL, 2 )
         AS key1,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 1, NULL, 3 )
         AS value1,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 2, NULL, 2 )
         AS key2,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 2, NULL, 3 )
         AS value2,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 3, NULL, 2 )
         AS key3,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 3, NULL, 3 )
         AS value3
FROM   override
SELECT SUBSTR( OVR_COMMENT, start1, end1 - start1 + 1 ) As value1,
       SUBSTR( OVR_COMMENT, start2, end2 - start2 + 1 ) As value2,
       SUBSTR( OVR_COMMENT, start3, end3 - start3 + 1 ) As value3
FROM   (
  SELECT OVR_COMMENT,
         INSTR( OVR_COMMENT, '=', 1, 1 ) + 1 AS start1,
         INSTR( OVR_COMMENT, '=', 1, 2 ) + 1 AS start2,
         INSTR( OVR_COMMENT, '=', 1, 3 ) + 1 AS start3,
         INSTR( OVR_COMMENT, '/', 1, 1 ) - 1 AS end1,
         INSTR( OVR_COMMENT, '/', 1, 2 ) - 1 AS end2,
         LENGTH( OVR_COMMENT ) AS end3
  FROM   override
)
查询2

select x.*,
       regexp_substr(regexp_substr(col, 'IVR Time=[^/]*', 1, 1), '[^=]+', 1, 2), 
       regexp_substr(regexp_substr(col, 'Reason=[^/]*', 1, 1), '[^=]+', 1, 2), 
       regexp_substr(regexp_substr(col, 'Desc=[^/]*', 1, 1), '[^=]+', 1, 2)
from (select 'IVR Time=20130409200450CST/Reason=FUL//Desc=TOD_FULL_DAY' as col
      from dual
     ) x
CREATE TABLE override ( OVR_COMMENT ) AS
SELECT 'RVR Time=20130409200450CST/Reason=FUL/Desc=TOD_FULL_DAY' FROM DUAL UNION ALL
SELECT 'RVR Time=20130409201134/Reason=FUL/Desc=TOD_FAMILY_LEAVE' FROM DUAL
SELECT REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 1, NULL, 2 )
         AS key1,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 1, NULL, 3 )
         AS value1,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 2, NULL, 2 )
         AS key2,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 2, NULL, 3 )
         AS value2,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 3, NULL, 2 )
         AS key3,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 3, NULL, 3 )
         AS value3
FROM   override
SELECT SUBSTR( OVR_COMMENT, start1, end1 - start1 + 1 ) As value1,
       SUBSTR( OVR_COMMENT, start2, end2 - start2 + 1 ) As value2,
       SUBSTR( OVR_COMMENT, start3, end3 - start3 + 1 ) As value3
FROM   (
  SELECT OVR_COMMENT,
         INSTR( OVR_COMMENT, '=', 1, 1 ) + 1 AS start1,
         INSTR( OVR_COMMENT, '=', 1, 2 ) + 1 AS start2,
         INSTR( OVR_COMMENT, '=', 1, 3 ) + 1 AS start3,
         INSTR( OVR_COMMENT, '/', 1, 1 ) - 1 AS end1,
         INSTR( OVR_COMMENT, '/', 1, 2 ) - 1 AS end2,
         LENGTH( OVR_COMMENT ) AS end3
  FROM   override
)
或者您可以使用
INSTR
SUBSTR

|     KEY1 |            VALUE1 |   KEY2 | VALUE2 | KEY3 |           VALUE3 |
|----------|-------------------|--------|--------|------|------------------|
| RVR Time | 20130409200450CST | Reason |    FUL | Desc |     TOD_FULL_DAY |
| RVR Time |    20130409201134 | Reason |    FUL | Desc | TOD_FAMILY_LEAVE |

select x.*,
       regexp_substr(regexp_substr(col, 'IVR Time=[^/]*', 1, 1), '[^=]+', 1, 2), 
       regexp_substr(regexp_substr(col, 'Reason=[^/]*', 1, 1), '[^=]+', 1, 2), 
       regexp_substr(regexp_substr(col, 'Desc=[^/]*', 1, 1), '[^=]+', 1, 2)
from (select 'IVR Time=20130409200450CST/Reason=FUL//Desc=TOD_FULL_DAY' as col
      from dual
     ) x
CREATE TABLE override ( OVR_COMMENT ) AS
SELECT 'RVR Time=20130409200450CST/Reason=FUL/Desc=TOD_FULL_DAY' FROM DUAL UNION ALL
SELECT 'RVR Time=20130409201134/Reason=FUL/Desc=TOD_FAMILY_LEAVE' FROM DUAL
SELECT REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 1, NULL, 2 )
         AS key1,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 1, NULL, 3 )
         AS value1,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 2, NULL, 2 )
         AS key2,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 2, NULL, 3 )
         AS value2,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 3, NULL, 2 )
         AS key3,
       REGEXP_SUBSTR( OVR_COMMENT, '(^|/)(.*?)=([^/]*)', 1, 3, NULL, 3 )
         AS value3
FROM   override
SELECT SUBSTR( OVR_COMMENT, start1, end1 - start1 + 1 ) As value1,
       SUBSTR( OVR_COMMENT, start2, end2 - start2 + 1 ) As value2,
       SUBSTR( OVR_COMMENT, start3, end3 - start3 + 1 ) As value3
FROM   (
  SELECT OVR_COMMENT,
         INSTR( OVR_COMMENT, '=', 1, 1 ) + 1 AS start1,
         INSTR( OVR_COMMENT, '=', 1, 2 ) + 1 AS start2,
         INSTR( OVR_COMMENT, '=', 1, 3 ) + 1 AS start3,
         INSTR( OVR_COMMENT, '/', 1, 1 ) - 1 AS end1,
         INSTR( OVR_COMMENT, '/', 1, 2 ) - 1 AS end2,
         LENGTH( OVR_COMMENT ) AS end3
  FROM   override
)

您好,谢谢您的回答,但我使用的是Oracle 9i,regexp\u substr无法使用它。@madhan。Oracle 9i已被“取消支持”超过十年()。此功能在Oracle 9i中不起作用。请让我知道,如果你有修复这个