У меня есть столбец, который представляет собой текст, как this-Выберите данные из позиции полукокса к следующим
Col = '/a/bbb/cc/aaa/ddd'
Я хочу вывести только ГЭБ. Это все между 2-м "/" и 3-м "/". Как мне это сделать?
У меня есть столбец, который представляет собой текст, как this-Выберите данные из позиции полукокса к следующим
Col = '/a/bbb/cc/aaa/ddd'
Я хочу вывести только ГЭБ. Это все между 2-м "/" и 3-м "/". Как мне это сделать?
Вы можете использовать
STRTOK('/a/bbb/cc/aaa/ddd', '/', 2)
или
REGEXP_SUBSTR('/a/bbb/cc/aaa/ddd', '[^/]+',1,2)
последовательны delmiter возможно, т.е. '//bbb/cc/aaa/ddd'
? Если да, то bbb
все еще правильный результат?
Вы можете использовать функцию SUBSTRING_INDEX (http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index)
Пример:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('/a/bbb/cc/aaa/ddd','/',3),'/',-1);
Использование SUBSTRING_INDEX
Запрос
SELECT SUBSTRING_INDEX(
SUBSTRING_INDEX(
column_name, '/', 3
), '/', -1
) AS new_column_name
FROM table_name;
У меня есть 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. Я знаю, что это очень уродливо, но кто знает, может быть, это может кому-то помочь :) *
Существует 4-й вариант для 'INSTR', * [occurance] *, просто используйте' 2' для второго или '3' для третьего'/'.И Oracle также поддерживает 'REGEXP_SUBSTR' – dnoeth
@dnoeth' REGEXP_SUBSTR', действительно, спасибо. –
STRTOK ('/ a/bbb/cc/aaa/ddd', '/', 2) отлично работал. Спасибо – ASuit