2013-08-09 4 views
1

Я пытаюсь извлечь числа между двумя словами, но «substr» не работает в сочетании с «instr». По крайней мере, я не получу!Извлечь текст между словами

Пример:

CODTAX TAX_DESCRIPTION 
----------------------- 
1225 NCM 85444900 IPI 0% ICMS 18% CST 060 IVA 41,00% IVA EXT 51,32% 

Количество экстракта между "IPI" и "%" является ICMS или между "IVA" и "%" IVA является 41.00.

CREATE TABLE TAX 
(
    CODTAX   NUMBER, 
    TAX_DESCRIPTION VARCHAR2(200 BYTE) 
); 

INSERT INTO TAX (CODTAX, TAX_DESCRIPTION) 
    VALUES (1505, 'NCM 29051220 IPI 0% ICMS 18% CST 000 IVA 0% IVA EXT 0%'); 
INSERT INTO TAX (CODTAX, TAX_DESCRIPTION) 
    VALUES (1258, 'NCM 85444900 IPI 0% ICMS 18% CST 060 IVA 41,00% IVA EXT 51,32%'); 
INSERT INTO TAX (CODTAX, TAX_DESCRIPTION) 
    VALUES (2051, 'NCM 85362000 IPI 10% ICMS 18% CST 060 IVA 43,00% IVA EXT 53,46%'); 

Результат должен быть:

CODTAX TAX_DESCRIPTION             IPI IVA 
---------------------------------------------------------------------------------- 
1505 NCM 29051220 IPI 0% ICMS 18% CST 000 IVA 0% IVA EXT 0%   0  0 
1258 NCM 85444900 IPI 0% ICMS 18% CST 060 IVA 41,00% IVA EXT 51,32% 0 41,00 
2051 NCM 85362000 IPI 10% ICMS 18% CST 060 IVA 43,00% IVA EXT 53,46% 10 43,00 
+0

Какой результат вы получаете? Я бы использовал описанный вами подход. – Karl

+0

Привет, Karl, ожидаемый результат равен 0 для IPI или 41,00 для IVA. Для каждого налога я создам один столбец! –

+0

Результат должен быть: CODTAX \t TAX_DESCRIPTION \t \t \t \t \t \t \t \t ИПИ \t IVA НКМ 29051220 ИПИ 0% ICMS 18% ДКБ 000 НДС 0% НДС EXT 0% \t \t \t НКМ 85444900 ИПИ 0% ICMS 18% ДКБ 060 IVA 41,00% НДС EXT 51,32% \t 41,00 НКМ 85362000 ИПИ 10% ICMS 18% ДКБ 060 IVA 43,00% IVA EXT 53 , 46% \t 43,00 –

ответ

0

Вы можете попробовать сочетание INSTR и REGEXP_SUBSTR.

SELECT A.*, 
     REGEXP_SUBSTR (A.TAX_DESCRIPTION, 
         '\d+,?\d*', 
         INSTR (a.tax_description, 'IPI')) IPI, 
     REGEXP_SUBSTR (A.TAX_DESCRIPTION, 
         '\d+,?\d*', 
         INSTR (a.tax_description, 'IVA')) IVA 
    FROM TAX A; 

INSTR используется для поиска первой позиции IPI и IVA. Затем он используется в функции REGEXP_SUBSTR, чтобы указать начальную позицию.

Регулярное выражение узор,

  • \ д + соответствует одному или более цифр.
  • ,? соответствует нулю или одной запятой.
  • \ d * соответствует нулю или более цифрам.
+0

Спасибо! Команда была худой, но регулярные выражения немного сложны. Вы можете узнать, есть ли сайт с юридическими ссылками, чтобы узнать, как использовать регулярные выражения? –

0

substr и instr вариант:

SQLFiddle

select 
    codtax, 
    tax_description, 
    (
    trim(substr(
     tax_description, 
     instr(tax_description, 'NCM') + length('NCM'), 
     instr(tax_description, 'IPI') - 
     (instr(tax_description, 'NCM') + length('NCM')) 
    )) 
) ncm, 
    (
    trim(substr(
     tax_description, 
     instr(tax_description, 'IPI') + length('IPI'), 
     instr(tax_description, '% ICMS') - 
     (instr(tax_description, 'IPI') + length('IPI')) 
    )) 
) ipi, 
    (
    trim(substr(
     tax_description, 
     instr(tax_description, 'ICMS') + length('ICMS'), 
     instr(tax_description, '% CST') - 
     (instr(tax_description, 'ICMS') + length('ICMS')) 
    )) 
) icms, 
    (
    trim(substr(
     tax_description, 
     instr(tax_description, 'CST') + length('CST'), 
     instr(tax_description, 'IVA') - 
     (instr(tax_description, 'CST') + length('CST')) 
    )) 
) cst, 
    (
    trim(substr(
     tax_description, 
     instr(tax_description, 'IVA') + length('IVA'), 
     instr(tax_description, '% IVA EXT') - 
     (instr(tax_description, 'IVA') + length('IVA')) 
    )) 
) iva, 
    (
    trim(substr(
     tax_description, 
     instr(tax_description, 'IVA EXT') + length('IVA EXT'), 
     instr(tax_description, '%', -1) - 
     (instr(tax_description, 'IVA EXT') + length('IVA EXT')) 
    )) 
) iva_ext 
from tax 
+0

Отлично, очень спасибо! –

+0

@DoubleR btw он должен работать fatser, чем подход с регулярным выражением – ThinkJet

Смежные вопросы