2015-08-05 4 views
1

Я пытаюсь найти подстроку в строке. Все, что я нахожу в сети, - это расположение его позиции. Я не забочусь о позиции и задал позицию на каждой строчке, которую я не могу сказать regexp_instr (X, 10, 5).Найти подстроку в строке Oracle

Я хочу сказать, если X в столбце String, то дайте мне новый столбец только с той строкой, которую я просил. Если не дайте мне Y.

Проблема в том, что 1 из 10 строк находится внутри столбца String, и я пытаюсь извлечь их из 1-го шага в качестве отдельной колонки.

Можно ли это сделать? Спасибо.

+0

использование в case case, например 'Select case, когда instr ('CAT', 'A')> 0, затем 'A' else 'Не в конце от double;' или добавить некоторые образцы с ожидаемыми результатами, чтобы помочь нам понять вопрос. – xQbert

ответ

0

может быть что-то вроде ... Но я неясным, если вы хотите один столбец, несколько столбцов или если вы хотите первый результат или все результаты, которые соответствуют ...

Так что, если столбец содержит «CAT» и вы ищете Z, C, A, T ... Какие результаты должны быть в итоговой колонке? Нет Z ... просто C или CAT или что?

SELECT CASE WHEN INSTR('CAT','Z')>0 THEN 'Z' 
      WHEN INSTR('CAT','C')>0 THEN 'C' 
      WHEN INSTR('CAT','A')>0 THEN 'A' 
      WHEN INSTR('CAT','T')>0 THEN 'T' 
      ELSE 'Not in' end from dual; 
+0

Спасибо, что работала блестяще. – Tinkinc

0

Чтобы найти строку для другой строки и вернуть искомую строку при обнаружении или фиксированную строку, если она не найдена, у вас есть несколько вариантов. Методы Instr и REGEXP_INSTR полагаться на то, что, когда он не нашел, что они возвращают индекс ноль (0), тогда как метод REGEXP_SUBSTR возвращает нуль, если не найден в противном случае она возвращает строку, которая соответствует шаблон поиска:

with dta as (
    select 'this is a test' str from dual union all 
    select 'every good boy does fine' from dual union all 
    select 'testing one two three' from dual 
), fnd as (
    select 'test' fnd, 'not found' fail from dual union all 
    select 'good' fnd, 'not good' fail from dual 
) 
select fnd 
    , str 
    , case instr(str, fnd) when 0 then fail else fnd end result 
    , case regexp_instr(str,fnd) when 0 then fail else fnd end result2 
    , nvl(regexp_substr(str, fnd), fail) result3 
    from dta, fnd 
    order by 1, 2; 
Смежные вопросы