Sql 从文本中提取值并将行转换为列

Sql 从文本中提取值并将行转换为列,sql,regex,oracle,Sql,Regex,Oracle,tbl1 ID | TXT -- | ----------------------------------------------------------------------------- 1 | Material discharged in hopper: Dest: FURNACE; ; 3

tbl1

ID | TXT -- | ----------------------------------------------------------------------------- 1 | Material discharged in hopper: Dest: FURNACE; ; 312 - CALCINE DOLOMIT: 1505kg; 2 | Dest: FURNACE; AUTO; 312 - CALCINE DOLOMIT: 1505kg; 3 | Material discharged in hopper: Dest: FURNACE; ; 401 - LIME-LUMP: 993kg; 312 - CALCINE DOLOMIT: 521kg; 4 | Dest: FURNACE; AUTO; 401 - LIME-LUMP: 993kg; 312 - CALCINE DOLOMIT: 521kg; 5 | Material discharged in hopper: Dest: FURNACE; ; 400 - LIME-LUMP: 1007kg; 6 | Dest: FURNACE; AUTO; 400 - LIME-LUMP: 1007kg; 我写了这个查询:

select id,txt,
        REGEXP_SUBSTR(txt, '\d+', 1, 2) AS CALCINE_DOLOMIT,
        REGEXP_SUBSTR(txt, '\d+', 1, 4) AS LIME_LUMP 
from tbl1  
但此查询有时会返回煅烧白云质的
石灰块

提取完值后,我想将第2、4、6行(TXT列具有
Dest:
string)移动到
Dest id
列,如下所示:

ID | CALCINE DOLOMIT| LIME-LUMP | -- | ----------------------------------------------------------------------------- 1 | 1505 |0 2 | 1505 |0 3 | 993 |521 4 | 993 |521 5 | 0 |1007 6 | 0 |1007 ID | CALCINE DOLOMIT| LIME-LUMP |DEST id -- | -------------------------------------- 1 | 1505 |0 |2 3 | 993 |521 |4 5 | 0 |1007 |6 ID |煅烧白云质|石灰块|目的ID -- | -------------------------------------- 1 | 1505 |0 |2 3 | 993 |521 |4 5 | 0 |1007 |6 请帮帮我


dbfiddle

您可以通过此查询获得所需的结果。它使用CTE从源中提取
煅烧白云石
石灰块
值,然后
将其连接到与提取值匹配的行上的原始表,并从
Dest:

WITH CTE AS (
  SELECT Id, 
         REGEXP_SUBSTR(txt, 'CALCINE DOLOMIT: (\d+)', 1, 1, '', 1) AS CD,
         REGEXP_SUBSTR(txt, 'LIME-LUMP: (\d+)', 1, 1, '', 1) AS LL
  FROM tbl1
  WHERE txt NOT LIKE 'Dest:%'
)
SELECT CTE.Id, CTE.CD "CALCINE DOLOMIT", CTE.LL "LIME-LUMP", t1.ID "Dest ID"
FROM tbl1 t1
JOIN CTE ON t1.txt LIKE 'Dest:%'
        AND (CTE.CD IS NULL OR REGEXP_LIKE(txt, CONCAT('CALCINE DOLOMIT: ', CTE.CD)))
        AND (CTE.LL IS NULL OR REGEXP_LIKE(txt, CONCAT('LIME-LUMP: ', CTE.LL)))
输出:

ID  CALCINE DOLOMIT     LIME-LUMP   Dest ID
1   1505                            2
3   521                 993         4
5                       1007        6