2015-10-01 5 views
6

Я борюсь с запросом в Oracle SQL, желая получить некоторые тайминги из некоторого текста, хранящегося в Oracle db.Oracle sql: получить только определенную часть подстроки

Table : 
kde_test (myString varchar(50)) 

Table contents (3 records): 
'task1 - 6m' 
'task2 - 66m' 
'task3 - 666m' 

Я хотел бы получить только интересную часть строки, будучи тайминги, так что я хотел бы получить только как результат «6», «66» & «666».

Искал этот форум немного, и встал с этим запросом в конце концов, но мне кажется, я не совсем понимаю, как результаты, которые он возвращает являются: 6м 66m 666m

select 
CASE 
WHEN myString like 'task1%' THEN substr(myString,9,INSTR(myString,'m',1,1)-1) 
WHEN myString like 'task2%' THEN substr(myString,9,INSTR(myString,'m',1,1)-1) 
WHEN myString like 'task3%' THEN substr(myString,9,INSTR(myString,'m',1,1)-1) 
END 
from kde_test 
where myString like 'task%' 

EDIT:

Поскольку некоторые решения (спасибо уже для быстрого реагирования) принимать во внимание конкретные значения (например, все 3 записи, оканчивающиеся на "6м.), может быть, лучше всего принимать во внимание значения могут быть:

Table contents (3 records): 
'task1 - 6m' 
'task2 - 58m' 
'task3 - 123m' 
+0

Похоже, что это может быть упрощено, чтобы найти строку символов между вторым появлением пространства и последним, но один, не -inclusive. –

+0

Нет проблем, вы могли бы просто использовать SUBSTR и INSTR и сделать его динамичным. Просмотрите отредактированный ответ с отредактированными значениями. –

ответ

2

Используйте SUBSTR и INSTR и сделайте его динамичным.

SUBSTR(str, 
     instr(str, ' - ', 1, 1) +3, 
     instr(str, 'm', 1, 1) - 
     instr(str, ' - ', 1, 1) -3 
    ) 

Например,

SQL> WITH DATA AS(
    2 SELECT 'task1 - 6m' str FROM dual UNION ALL 
    3 SELECT 'task2 - 66m' str FROM dual UNION ALL 
    4 SELECT 'task3 - 666m' str FROM dual UNION ALL 
    5 SELECT 'task4 - 58m' str FROM dual UNION ALL 
    6 SELECT 'task5 - 123m' str FROM dual 
    7 ) 
    8 SELECT str, 
    9 SUBSTR(str, instr(str, ' - ', 1, 1) +3, 
10    instr(str, 'm', 1, 1) - instr(str, ' - ', 1, 1) -3) new_st 
11 FROM DATA; 

STR   NEW_STR 
------------ ------------ 
task1 - 6m 6 
task2 - 66m 66 
task3 - 666m 666 
task4 - 58m 58 
task5 - 123m 123 

SQL> 
2

вы можете использовать этот способ слишком

select regexp_replace(SUBSTR('task3 - 666m' , 
    INSTR('task3 - 666m', '-',1, 1)+1, length('task3 - 666m')), '[A-Za-z]') 
    from dual 


result :666 
1

Для того, чтобы исправить свой текущий запрос, вы должны изменить следующую строку - «Instr (MyString, 'м', 1 , 1) -1 "до" INSTR (myString, 'm', 1,1) -9 ". Однако другие ответы, представленные выше, кажутся более элегантным решением вашей проблемы.

Я действительно чувствовал необходимость опубликовать это, чтобы уточнить, что не работает в текущем запросе - в функции INSTR возвращается позиция буквы m, а затем используется как длина строки для печати. Мое исправление говорит, что запрос печатает все от 9-го символа до положения буквы m, что приводит к требуемому времени задачи.

1

Я попытался разделить это на две части

  1. Первых выбрать строку после -

    regexp_substr ('task1 - 1234m', '[^ _ ]+',1, 3) --results 1234m 
    
  2. Fetch число части строки сгружена с выхода первого

    regexp_substr(regexp_substr ('task1 - 1234m', '[^ _ ]+',1, 3),'[[:digit:]]*') 
    --output 1234 
    

Таким образом, окончательный запрос

SELECT regexp_substr(regexp_substr (mystring, '[^ _ ]+',1, 3),'[[:digit:]]*') 
FROM kde_test; 
1

Использования Это: -

select substr(replace(myString,'m',''),9) output 
from kde_test 
where myString like 'task%' 
Смежные вопросы