Использование REGEXP_LIKE с несколькими условиями для соответствия шаблонам - PullRequest
1 голос
/ 08 июля 2019

Имя таблицы: test Column_Name: ID Правильный формат для идентификатора столбца - '^ \ d {4} - \ d {6} - \ d {3} - \ d1} $'

Условия: должнысоответствует приведенному выше шаблону, но не должно начинаться с 15, чисел от 2-8, 00, 000, 0000.

Использование REGEXP_LIKE для соответствия указанному условию, но невозможно включить начало со сценариями в одном REGEXP_LIKE:

with test as (
select  '0614-210297-103-6' ID from dual union all
select  '0014-210297-103-6' ID from dual union all
select  '0004-210297-103-6' ID from dual union all
select  '0000-210297-103-6' ID from dual union all
select  '00120792-2..' ID from dual union all
select  '0614- 210297-103-6' ID from dual union all
select  '0614210297-103-6' ID from dual union all
select  '2614-210297-103-6' ID from dual
)        
select
case
    when regexp_like(ID, '^\d{4}-\d{6}-\d{3}-\d{1}$') 
        then ID
    else
        case
            when regexp_count(ID, '\d') = 14
                then
                    case
                        when
                            not regexp_like(ID,'^15|^2-8|^00|^000|^0000')
                        then ID
                    end
            else ID
        end
end ID_tr
from test

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Вы говорите: «не должно начинаться с 15, числа от 2-8, 00, 000, 0000».

Вы можете упростить это до: не следует начинать с 00, 15, 2n - 8n.

Или вы можете быть положительным вместо отрицательного: должны начинаться с 01 по 09, или с 10 по 14, или с 16 по 19, или с 9n.

При положительных условиях вы можете получить один REGEXP:

with test(id) as (
select  '0614-210297-103-6' ID from dual union all
select  '0014-210297-103-6' ID from dual union all
select  '0004-210297-103-6' ID from dual union all
select  '0000-210297-103-6' ID from dual union all
select  '00120792-2..' ID from dual union all
select  '0614- 210297-103-6' ID from dual union all
select  '0614210297-103-6' ID from dual union all
select  '1514-210297-103-6' ID from dual union all
select  '1614-210297-103-6' ID from dual union all
select  '2614-210297-103-6' ID from dual union all
select  '9614-210297-103-6' ID from dual
)      
select id from test
where regexp_like(id,'^(0[1-9]|1[1-46-9]|9\d)\d{2}-\d{6}-\d{3}-\d$')

ID
0614-210297-103-6
1614-210297-103-6
9614-210297-103-6
0 голосов
/ 08 июля 2019

Это может быть способ упростить ваше состояние, даже если не в одном регулярном выражении:

regexp_like(ID, '^[190]\d{3}-\d{6}-\d{3}-\d$') and
substr(ID, 1, 2) not in ('00', '15')

Здесь я использую ^[190]\d{3} вместо ^\d{4}, чтобы соответствовать, только если первая цифра не в 2-8; единственный способ избежать строк, начинающихся с 15 или 00, 000, 0000, - проверить первые два символа с помощью substr.

С вашими данными, это

select ID,
    case
     when regexp_like(ID, '^[190]\d{3}-\d{6}-\d{3}-\d$') and
          substr(ID, 1, 2) not in ('00', '15') then ID
    end as result
from test

дает:

ID                 RESULT            
------------------ ------------------
0614-210297-103-6  0614-210297-103-6 
0014-210297-103-6                    
0004-210297-103-6                    
0000-210297-103-6                    
00120792-2..                         
0614- 210297-103-6                   
0614210297-103-6                     
2614-210297-103-6                    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...