繁体   English   中英

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

[英]Extract Value From Text And Convert Row To Column

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;                                                         

我想提取LIME-LUMPCALCINE DOLOMIT的数字并显示在单独的列中,如下所示:

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

我写了这个查询:

select id,txt,
        REGEXP_SUBSTR(txt, '\d+', 1, 2) AS CALCINE_DOLOMIT,
        REGEXP_SUBSTR(txt, '\d+', 1, 4) AS LIME_LUMP 
from tbl1  

但是此查询有时会返回Calcine dolomitLime Lump值...

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

ID | CALCINE DOLOMIT| LIME-LUMP |DEST id
-- | --------------------------------------
 1 | 1505           |0          |2                                            
 3 | 993            |521        |4   
 5 | 0              |1007       |6                                                             

请帮我...

db<> 在这里摆弄

您可以使用此查询获得所需的结果。 它使用 CTE 使用REGEXP_SUBSTR从源中提取CALCINE_DOLOMITLIME_LUMP值,然后在与提取的值匹配的行上将其JOIN回原始表并以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)))

Output:

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

dbfiddle 上的演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM