Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 SUBSTR INSTR... надо распарсить номер накладной  [new]
Anton_Demin
Member

Откуда: Ставрополь
Сообщений: 261
Добрый день

Есть некий обработчик номеров накладных, который из номера выделяет необходимую строку.
От внешней системы стали приходить новые номера вида ЦП-6278-0000030 и вот для них результат должен быть 30, а сейчас 6278
Как дописать поле rezultat, что бы для новой накладной было значение 30 и не испортить другие?

with tbl as (
select 'ЦП-21838611-1-1' bill  from dual union
select 'ЦП-16945846/1-1' bill  from dual union
select 'ЦП-2094102' bill  from dual union
select 'НП-0000053/3/1/1' bill  from dual union
select 'ЦП-6278-0000030' bill  from dual --!!! new bill
)
select bill_full, -- Исходный номер
       bill, 
       bill_shrinked,
       COALESCE(SUBSTR(bill_shrinked,1,INSTR(bill_shrinked,'-')-1), bill_shrinked, 
                SUBSTR(bill,1,INSTR(bill,'-')-1), bill) AS rezultat -- результат!!!
FROM
(select bill bill_full,
       SUBSTR(bill, 4) AS bill,
       SUBSTR(bill, 4, INSTR(bill, '/') - 4) AS bill_shrinked
from tbl)


Спасибо
8 фев 19, 11:36    [21804171]     Ответить | Цитировать Сообщить модератору
 Re: SUBSTR INSTR... надо распарсить номер накладной  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17182
    , coalesce(regexp_substr(bill_full,'\w+-\d+-(\d{7})$',1,1,'',1)
              , regexp_substr(bill_full,'\w+-(\d+)',1,1,'',1)
              )
8 фев 19, 11:53    [21804188]     Ответить | Цитировать Сообщить модератору
 Re: SUBSTR INSTR... надо распарсить номер накладной  [new]
Anton_Demin
Member

Откуда: Ставрополь
Сообщений: 261
andrey_anonymous,

спасибо, у меня пока такой колхоз ((( надо учить регулярки
       COALESCE(SUBSTR(bill_shrinked,1,INSTR(bill_shrinked,'-')-1), bill_shrinked, 
                CASE
                     WHEN  INSTR(bill,'-',-1) > 0 AND
                           LENGTH(SUBSTR(bill,INSTR(bill,'-',-1)+1)) > 6 AND 
                           INSTR(SUBSTR(bill,INSTR(bill,'-',-1)+1),'-') = 0 AND
                           INSTR(SUBSTR(bill,INSTR(bill,'-',-1)+1),'/') = 0 THEN 
                 LTRIM(SUBSTR(bill,INSTR(bill,'-',-1)+1),'0')
                 ELSE NULL END,                                                                    
                SUBSTR(bill,1,INSTR(bill,'-')-1), bill) AS bill
8 фев 19, 11:56    [21804192]     Ответить | Цитировать Сообщить модератору
 Re: SUBSTR INSTR... надо распарсить номер накладной  [new]
-2-
Member

Откуда:
Сообщений: 14504
Anton_Demin,

Из приведенных данных не следует, что вчера не было ЦП-3-2-1, а завтра не будет ЦП-1234567-7654321-1.
8 фев 19, 12:14    [21804216]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить