Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于正则表达式设置标志列_Sql_Oracle - Fatal编程技术网

Sql 基于正则表达式设置标志列

Sql 基于正则表达式设置标志列,sql,oracle,Sql,Oracle,我开发了以下查询,但它没有按预期工作: 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 SELEC

我开发了以下查询,但它没有按预期工作:

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|

如何修改查询以获得该输出?还有更好的正则表达式吗?

根据您的描述,正则表达式模式应该是

'^(C0[5-9]|A[0-8][0-9]|A9[0-7])'
^
锚定到值的开头,括号允许任何管道分隔模式匹配;由于A00到A89可以一次操作完成,因此模式被简化

将同一行标记为原始查询。下一步是将其移动到子查询中,然后使用一个由
p_num
划分的分析函数,您希望该函数是公共的:

max(found_code) over (partition by p_num)
因此,它们一起成为(与其他行匹配不同的规则):


这不是您当前查询的输出,因此可能是您想要实现的输出;但是为什么ie将
E79
标记为1的行?
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