[英]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 |
+---------+-----------+--------+--------------+------------+------------------+
样品 Output:
+---------+-----------+--------+--------------+------------+-----------+
| 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()
function 计算该字符的数量
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.