2016-03-16 2 views

ответ

2

Вы можете использовать

STRTOK('/a/bbb/cc/aaa/ddd', '/', 2) 

или

REGEXP_SUBSTR('/a/bbb/cc/aaa/ddd', '[^/]+',1,2) 

последовательны delmiter возможно, т.е. '//bbb/cc/aaa/ddd'? Если да, то bbb все еще правильный результат?

+0

STRTOK ('/ a/bbb/cc/aaa/ddd', '/', 2) отлично работал. Спасибо – ASuit

0

Использование SUBSTRING_INDEX

Запрос

SELECT SUBSTRING_INDEX(
      SUBSTRING_INDEX(
       column_name, '/', 3 
    ), '/', -1 
) AS new_column_name 
FROM table_name; 
0

У меня есть Oracle SQL Developer (версия 4.0.0.13) и не признает метод SUBSTRING_INDEX, поэтому я должен был сделать это с помощью следующего метода: SUBSTR (your_string, starting_index, длина).

Но мы должны найти start_index и длина первая. Я использовал INSTR (your_string, 'string_to_find' [, start_index]) для этого.

Во-первых я нашел индекс первого "/" так:

 SELECT INSTR('/a/bbb/cc/aaa/ddd', '/') from dual; 

Индекс второго "/" (начиная с индекса будет результат этого запроса +1):

 SELECT INSTR('/a/bbb/cc/aaa/ddd', '/', 
      (SELECT INSTR('/a/bbb/cc/aaa/ddd', '/')+1 FROM dual 
     )) 
     FROM dual; 

длина строки между второй и третьей «/» будет индекс третьего «/» - индекс второго «/» - 1:

 (SELECT INSTR('/a/bbb/cc/aaa/ddd', '/', 
     (SELECT INSTR('/a/bbb/cc/aaa/ddd', '/', 
      (SELECT INSTR('/a/bbb/cc/aaa/ddd', '/')+1 FROM dual 
     ))+1 
     FROM dual 
     )) 
     FROM dual 
     ) - 
     (SELECT INSTR('/a/bbb/cc/aaa/ddd', '/', 
     (SELECT INSTR('/a/bbb/cc/aaa/ddd', '/')+1 FROM dual 
     )) 
     FROM dual 
     )-1 

Наконец, я закончил с этим кодом:

SELECT SUBSTR('/a/bbb/cc/aaa/ddd', 
    (SELECT INSTR('/a/bbb/cc/aaa/ddd', '/', 
    (SELECT INSTR('/a/bbb/cc/aaa/ddd', '/')+1 FROM dual 
    )) 
    FROM dual 
)+1, 
    (SELECT INSTR('/a/bbb/cc/aaa/ddd', '/', 
    (SELECT INSTR('/a/bbb/cc/aaa/ddd', '/', 
     (SELECT INSTR('/a/bbb/cc/aaa/ddd', '/')+1 FROM dual 
    ))+1 
    FROM dual 
    )) 
    FROM dual 
) - 
    (SELECT INSTR('/a/bbb/cc/aaa/ddd', '/', 
    (SELECT INSTR('/a/bbb/cc/aaa/ddd', '/')+1 FROM dual 
    )) 
    FROM dual 
)-1) 
FROM dual; 

* P.S. Я знаю, что это очень уродливо, но кто знает, может быть, это может кому-то помочь :) *

+0

Существует 4-й вариант для 'INSTR', * [occurance] *, просто используйте' 2' для второго или '3' для третьего'/'.И Oracle также поддерживает 'REGEXP_SUBSTR' – dnoeth

+0

@dnoeth' REGEXP_SUBSTR', действительно, спасибо. –

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