根据列中存在的值将一行拆分为 2 行
Splitting a row into 2 rows based on value present in a column
我需要根据列中的值将一条记录拆分为两条记录。
示例输入:
+---------+-----------+--------+--------------+------------+------------------+
| REC_KEY | SURR_KEY | REC_YR | MANUFACTURER | MODEL_NAME | ENG_POWER |
+---------+-----------+--------+--------------+------------+------------------+
| 12345 | 615099386 | 2003 | BMW | Z8 | 4.8L V8; 4.9L V8 |
+---------+-----------+--------+--------------+------------+------------------+
示例输出:
+---------+-----------+--------+--------------+------------+-----------+
| REC_KEY | SURR_KEY | REC_YR | MANUFACTURER | MODEL_NAME | ENG_POWER |
+---------+-----------+--------+--------------+------------+-----------+
| 12345 | 615099386 | 2003 | BMW | Z8 | 4.8L V8 |
| 12345 | 615099386 | 2003 | BMW | Z8 | 4.9L V8 |
+---------+-----------+--------+--------------+------------+-----------+
有什么办法可以实现吗?
您可以通过使用 REGEXP_SUBSTR()
按 ;
个字符拆分该列的值,同时通过 REGEXP_COUNT()
函数
计算该字符的数量
SELECT rec_key, surr_key, rec_yr, manufacturer, model_name,
TRIM( REGEXP_SUBSTR(eng_power,'[^;]+',1,level) ) AS eng_power
FROM tab
CONNECT BY level <= REGEXP_COUNT(eng_power,';') + 1
AND PRIOR SYS_GUID() IS NOT NULL
AND PRIOR rec_key = rec_key
试试这个 SQL 脚本:
with cte(a,b,c,d,e,f) as
( select 12345 , 615099386 , 2003 ,'BMW','Z8','4.8L V8; 4.9L V8' from dual)
select a,b,c,d,e,
ltrim(regexp_substr(f,'[^;]+',1,level)) as f from cte
connect by level<=length(f)-length(replace(f,';',''))+1;
我需要根据列中的值将一条记录拆分为两条记录。
示例输入:
+---------+-----------+--------+--------------+------------+------------------+
| REC_KEY | SURR_KEY | REC_YR | MANUFACTURER | MODEL_NAME | ENG_POWER |
+---------+-----------+--------+--------------+------------+------------------+
| 12345 | 615099386 | 2003 | BMW | Z8 | 4.8L V8; 4.9L V8 |
+---------+-----------+--------+--------------+------------+------------------+
示例输出:
+---------+-----------+--------+--------------+------------+-----------+
| REC_KEY | SURR_KEY | REC_YR | MANUFACTURER | MODEL_NAME | ENG_POWER |
+---------+-----------+--------+--------------+------------+-----------+
| 12345 | 615099386 | 2003 | BMW | Z8 | 4.8L V8 |
| 12345 | 615099386 | 2003 | BMW | Z8 | 4.9L V8 |
+---------+-----------+--------+--------------+------------+-----------+
有什么办法可以实现吗?
您可以通过使用 REGEXP_SUBSTR()
按 ;
个字符拆分该列的值,同时通过 REGEXP_COUNT()
函数
SELECT rec_key, surr_key, rec_yr, manufacturer, model_name,
TRIM( REGEXP_SUBSTR(eng_power,'[^;]+',1,level) ) AS eng_power
FROM tab
CONNECT BY level <= REGEXP_COUNT(eng_power,';') + 1
AND PRIOR SYS_GUID() IS NOT NULL
AND PRIOR rec_key = rec_key
试试这个 SQL 脚本:
with cte(a,b,c,d,e,f) as
( select 12345 , 615099386 , 2003 ,'BMW','Z8','4.8L V8; 4.9L V8' from dual)
select a,b,c,d,e,
ltrim(regexp_substr(f,'[^;]+',1,level)) as f from cte
connect by level<=length(f)-length(replace(f,';',''))+1;