Извлечение значения из текста и преобразование строки в столбец - PullRequest
1 голос
/ 11 ноября 2019

tbl1 Is

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-LUMP и CALCINE 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  

, но этот запрос возвращает значение Lime Lump для Calcine dolomit иногда ...

После извлечения значений я хочу переместить строку 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 <> скрипка здесь

1 Ответ

1 голос
/ 11 ноября 2019

Вы можете получить нужные результаты с помощью этого запроса. Он использует CTE для извлечения значений CALCINE_DOLOMIT и LIME_LUMP из источника, используя REGEXP_SUBSTR, затем JOIN s, которые возвращаются к исходной таблице в строках, которые соответствуют извлеченным значениям, и начинаются с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

Демонстрация на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...