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