Установить флаг столбца на основе регулярного выражения - PullRequest
0 голосов
/ 25 октября 2018

Я разработал следующий запрос, но он не работает должным образом:

WITH TABLE1 AS
(
SELECT 613414473 as ID,  1706014200964  as P_NUM, 119539 as d_id,  'F20.0'  AS CODE FROM DUAL UNION ALL
SELECT 613414473 as ID,  1706014200964  as P_NUM, 119539 as d_id,  'F22.0'  AS CODE FROM DUAL UNION ALL
SELECT 613415801 as ID,  1707045167741  as P_NUM, 115182 as d_id,  'A94.0'  AS CODE FROM DUAL UNION ALL
SELECT 613415801 as ID,  1707045167741  as P_NUM, 115182 as d_id,  NULL     AS CODE FROM DUAL UNION ALL
SELECT 613417084 as ID,  1702038456441  as P_NUM, 6541   as d_id,  'E79'    AS CODE FROM DUAL UNION ALL
SELECT 613417084 as ID,  1702038456421  as P_NUM, 6541   as d_id,  'I10'    AS CODE FROM DUAL UNION ALL
SELECT 613418372 as ID,  1706226211517  as P_NUM, 25727  as d_id,  'F32.9'  AS CODE FROM DUAL )
SELECT T1.* 
    , CASE when regexp_like( CODE, 'C0[5-9]|' ||
                               'A0[0-9]|A1[0-9]|A2[0-9]|A3[0-9]|A4[0-9]|A5[0-9]|A6[0-9]|A7[0-9]|A8[0-9]|A9[0-7]|' )
                 THEN 1
                 ELSE 0  END AS FOUND_CODE    
FROM  TABLE1 T1;

Я хочу, чтобы коды, подобные C0[5-9]% или A0[0-97], были помечены значением 1, а затем длято же самое p_num, если был найден хотя бы один код для установки всех флагов для этого p_num в 1.

Пример выходных данных:

| 613414473|1706014200964|119539|F20.0|0|
| 613414473|1706014200964|119539|F22.0|0|
| 613415801|1707045167741|115182|A94.0|1|
| 613415801|1707045167741|115182|NULL |1|
| 613417084|1702038456441|6541  |E79  |0|
| 613417084|1702038456421|6541  |I10  |0|
| 613418372|1706226211517|25727 |F32.9|0|

Как изменитьмой запрос, чтобы получить этот вывод?И есть ли лучшее регулярное выражение, которое я могу использовать?

1 Ответ

0 голосов
/ 25 октября 2018

Исходя из вашего описания, шаблон регулярного выражения должен быть

'^(C0[5-9]|A[0-8][0-9]|A9[0-7])'

. ^ привязывает начало значения, а круглые скобки позволяют сопоставить любой из разделенных конвейерами шаблонов;и шаблоны упрощаются, поскольку A00-A89 могут обрабатываться за один раз.

Это помечает одну строку с вашим исходным запросом.Следующий этап - переместить это в подзапрос, а затем использовать аналитическую функцию, разбитую на p_num, которую вы хотите использовать в общем виде:

max(found_code) over (partition by p_num)

Таким образом, это становится (с дополнительными строками для соответствиядругое правило):

with table1 (id, p_num, d_id, code) as
(
  select 613414470, 1706014200960, 119530, 'D99'   from dual union all
  select 613414471, 1706014200960, 119531, 'C05'   from dual union all
  --
  select 613414473, 1706014200964, 119539, 'F20.0' from dual union all
  select 613414473, 1706014200964, 119539, 'F22.0' from dual union all
  select 613415801, 1707045167741, 115182, 'A94.0' from dual union all
  select 613415801, 1707045167741, 115182, null    from dual union all
  select 613417084, 1702038456441, 6541  , 'E79'   from dual union all
  select 613417084, 1702038456421, 6541  , 'I10'   from dual union all
  select 613418372, 1706226211517, 25727 , 'F32.9' from dual 
)
select id, p_num, d_id, code, max(found_code) over (partition by p_num) as found_code
from (
  select t1.*
       , case when regexp_like( code, '^(C0[5-9]|A[0-8][0-9]|A9[0-7])' )
              then 1
              else 0
         end as found_code
  from table1 t1
);

           ID         P_NUM          D_ID CODE     FOUND_CODE
------------- ------------- ------------- ----- -------------
    613414470 1706014200960        119530 D99               1
    613414471 1706014200960        119531 C05               1
    613414473 1706014200964        119539 F20.0             0
    613414473 1706014200964        119539 F22.0             0
    613415801 1707045167741        115182 A94.0             1
    613415801 1707045167741        115182                   1
    613417084 1702038456441          6541 E79               0
    613417084 1702038456421          6541 I10               0
    613418372 1706226211517         25727 F32.9             0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...