将字符串 oracle 拆分为单个列并插入 table
Split string oracle into a single column and insert into a table
我有一个 table 的列数据格式如下(Row# 只是为了指示行号)。
Row#1 :test.doc#delimiter#1234,test1.doc#delimiter#1235,test2.doc#delimiter#1236<br>
Row#2 :fil1.txt#delimiter#1456,fil1.txt#delimiter#1457
我想使用逗号 (,) 作为分隔符拆分字符串,将所有内容列在一列中并插入新的 table。
输出应该是这样的(Row# 只是为了指示行号):
Row#1:test.doc#delimiter#1234<br>
Row#2:test1.doc#delimiter#1235<br>
Row#3:test2.doc#delimiter#1236<br>
Row#4: fil1.txt#delimiter#1456
谁能帮我做这个?
如果你想找到一个现有的delimier并拆分它
试试这个查询:
select substr(filed_name ,
REGEXP_SUBSTR(filed_name,'#demilimer#',1),
(REGEXP_SUBSTR(filed_name,'#demilimer#',2)-1)
) col1 ,
substr(filed_name ,
REGEXP_SUBSTR(filed_name,'#demilimer#',2),
REGEXP_SUBSTR(filed_name,'#demilimer#',3)- (REGEXP_SUBSTR(filed_name,'#demilimer#',2))
) col2 ,
substr(filed_name ,
REGEXP_SUBSTR(filed_name,'#demilimer#',3),
length(filed_name)- (REGEXP_SUBSTR(filed_name,'#demilimer#',3))
) col3 /* last col should take up to the length */
from table_name
一种简单的方法是,对于每一行,将字符串拆分为多行并将其插入到目标 table。在此站点上有多种方法可以将单个字符串拆分为多行。一个简单的搜索应该会给你一些答案。
假设您的 table 称为 origtable,包含这些字符串的列称为 mycol,目标 table 称为 destTable。
BEGIN
FOR orig_row IN (SELECT mycol from origTable) LOOP
INSERT INTO destTable(outCol)
SELECT REGEXP_SUBSTR (orig_row.mycol,'(.*?)(,|$)',1,LEVEL,NULL,1)
FROM dual
CONNECT BY LEVEL <= REGEXP_COUNT (orig_row.mycol, ',') + 1;
END LOOP;
END;
WITH data AS (
SELECT 'test.doc#delimiter#1234,test1.doc#delimiter#1235,test2.doc#delimiter#1236' AS "value" FROM DUAL
UNION ALL
SELECT 'fil1.txt#delimiter#1456,fil1.txt#delimiter#1457' AS "value" FROM DUAL
)
SELECT REGEXP_SUBSTR( data."value", '[^,]+', 1, levels.COLUMN_VALUE )
FROM data,
TABLE(
CAST(
MULTISET(
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= LENGTH( regexp_replace( "value", '[^,]+')) + 1
) AS sys.OdciNumberList
)
) levels;
我有一个 table 的列数据格式如下(Row# 只是为了指示行号)。
Row#1 :test.doc#delimiter#1234,test1.doc#delimiter#1235,test2.doc#delimiter#1236<br>
Row#2 :fil1.txt#delimiter#1456,fil1.txt#delimiter#1457
我想使用逗号 (,) 作为分隔符拆分字符串,将所有内容列在一列中并插入新的 table。
输出应该是这样的(Row# 只是为了指示行号):
Row#1:test.doc#delimiter#1234<br>
Row#2:test1.doc#delimiter#1235<br>
Row#3:test2.doc#delimiter#1236<br>
Row#4: fil1.txt#delimiter#1456
谁能帮我做这个?
如果你想找到一个现有的delimier并拆分它
试试这个查询:
select substr(filed_name ,
REGEXP_SUBSTR(filed_name,'#demilimer#',1),
(REGEXP_SUBSTR(filed_name,'#demilimer#',2)-1)
) col1 ,
substr(filed_name ,
REGEXP_SUBSTR(filed_name,'#demilimer#',2),
REGEXP_SUBSTR(filed_name,'#demilimer#',3)- (REGEXP_SUBSTR(filed_name,'#demilimer#',2))
) col2 ,
substr(filed_name ,
REGEXP_SUBSTR(filed_name,'#demilimer#',3),
length(filed_name)- (REGEXP_SUBSTR(filed_name,'#demilimer#',3))
) col3 /* last col should take up to the length */
from table_name
一种简单的方法是,对于每一行,将字符串拆分为多行并将其插入到目标 table。在此站点上有多种方法可以将单个字符串拆分为多行。一个简单的搜索应该会给你一些答案。
假设您的 table 称为 origtable,包含这些字符串的列称为 mycol,目标 table 称为 destTable。
BEGIN
FOR orig_row IN (SELECT mycol from origTable) LOOP
INSERT INTO destTable(outCol)
SELECT REGEXP_SUBSTR (orig_row.mycol,'(.*?)(,|$)',1,LEVEL,NULL,1)
FROM dual
CONNECT BY LEVEL <= REGEXP_COUNT (orig_row.mycol, ',') + 1;
END LOOP;
END;
WITH data AS (
SELECT 'test.doc#delimiter#1234,test1.doc#delimiter#1235,test2.doc#delimiter#1236' AS "value" FROM DUAL
UNION ALL
SELECT 'fil1.txt#delimiter#1456,fil1.txt#delimiter#1457' AS "value" FROM DUAL
)
SELECT REGEXP_SUBSTR( data."value", '[^,]+', 1, levels.COLUMN_VALUE )
FROM data,
TABLE(
CAST(
MULTISET(
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= LENGTH( regexp_replace( "value", '[^,]+')) + 1
) AS sys.OdciNumberList
)
) levels;