根据列中存在的值将一行拆分为 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

Demo

试试这个 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;