在oracle sql中使用(/)字符将单个varchar列值拆分为多个列
原始的_列是 IVR时间=20130409200450CST/原因=FUL//Desc=TOD\u全天 我的结果是在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,
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中不起作用。请让我知道,如果你有修复这个