вычисление подстроки и строки в Oracle - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь использовать подстроку & instring для извлечения необходимого значения в зависимости от условий.

Мне нужна конкретная часть, если столбец manager_name начинается с 'Express door%' или 'Express Door%' (D - заглавная буква)

и

извлечение значения после на для 2 записей и для 1 записи извлечение после на и до ','

Пример кода:

CREATE TABLE [Test](
service_id int,
category_id int,
employee_name varchar(50)
)

insert into Test values (38756,201830,'kalyan');
insert into Test values (38366,201790,'kalyan');
insert into Test values (38756,201830,'kalyan');
insert into Test values (38366,201790,'kalyan');
insert into Test values (38603,201790,'Ricky');


CREATE TABLE [major](
spec_id int,
manager_name varchar(150)
)

insert into major values (38756,null)
insert into major values (38366,null)
insert into major values (38756,'Express Door for on going : DECLINE by kalyan')
insert into major values (38366,'Express door for on going : APPROVE by Joy kalyan')
insert into major values (38366,'Request required')
insert into major values (38603,'Express door for on going : APPROVE by JRicky, Condtion:test')

Ниже используемого запроса SQL:

    select  distinct 
         t.service_id
        ,m.spec_id
       , t.category_id
       , t.employee_name
       , substr(m.manager_name , instr(m.manager_name , 'by') + 3) Manager       
from test t 
left outer join major m on t.service_id = m.spec_id 
where (instr(m.manager_name, 'Express Door') > 0 or instr(m.manager_name, 'Express door') > 0);

мой ожидаемый результат должен выглядеть следующим образом:

service_id   category_id       employee_name     manager
38366           201790          kalyan           Joy kalyan
38756           201830          kalyan           kalyan
38603           201790          Ricky            JRicky

Заранее спасибо

Света J

1 Ответ

0 голосов
/ 08 декабря 2018

Вы должны определить индекс ',' и передать длину подходящего слова в качестве третьего аргумента для своего тестового сценария.

Кроме того, я упростил ваше предложение WHERE с помощью функции INITCAPи LIKE

SELECT DISTINCT t.service_id,
                m.spec_id,
                t.category_id,
                t.employee_name,
                substr(m.manager_name,instr(m.manager_name,'by') + 3,
                    CASE
                     WHEN m.manager_name LIKE '%,%' 
                        THEN instr(m.manager_name,',') 
                                           - (instr(m.manager_name,'by') + 3)
                          ELSE length(m.manager_name)
                                          - (instr(m.manager_name,'by') + 2)
                     END
                ) AS manager
FROM test t
LEFT OUTER JOIN major m ON t.service_id = m.spec_id
WHERE initcap(m.manager_name) LIKE '%Express Door%'
ORDER BY employee_name;

Как вы можете видеть, он становится немного более запутанным с несколькими шаблонами для сравнения, используя чисто INSTR и SUBSTR.Мы можем упростить его, используя REGEXP_SUBSTR, хотя это может быть менее эффективно.

select  distinct 
         t.service_id
        ,m.spec_id
       , t.category_id
       , t.employee_name
       , REGEXP_SUBSTR(manager_name,'by(.*?)(,|$)',1,1,null,1) as  manager
from test t 
left outer join major m on t.service_id = m.spec_id 
where initcap(m.manager_name) like  '%Express Door%'
ORDER by employee_name;

by(.*?)(,|$) - соответствует by, за которым следует набор слов (имен) перед нахождением запятой или конца строки..*? для не жадного совпадения.

Демо

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