2015-10-01 77 views
6

我在Oracle SQL中正在努力處理查詢,希望從存儲在Oracle數據庫中的某些文本中獲取一些時間。Oracle sql:僅獲取子字符串的特定部分

Table : 
kde_test (myString varchar(50)) 

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

我想只得到字符串的有趣的部分,是定時的,所以我想只能得到「6」,「66」 &「666」作爲結果。

搜查這個論壇了一下,此查詢最終站了起來,但似乎我不完全得到它,因爲它所返回的結果是: 6米 66米 666米

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%' 

編輯:

由於一些解決方案(感謝已經快速響應)考慮到特定值(例如,所有3條關於「6米」結尾。),也許是最好要考慮到的值可以是:

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

它看起來像這樣可以簡化爲尋找空間的第二次出現和倒數第二之間的字符串,非-包括的。 –

+0

沒問題,您可以簡單地使用SUBSTR和INSTR並使其動態化。用編輯後的值查看編輯後的答案。 –

回答

2

使用SUBSTRINSTR並使其變爲動態。

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的, 'M',1 ,1)-1「到」INSTR(myString,'m',1,1)-9「。 但是,上面提供的其他答案看起來像是您的問題的更優雅的解決方案。

我確實覺得需要發佈這個只是爲了澄清什麼在當前查詢中效果不好 - 在INSTR函數返回m字母的位置,然後用作要打印的字符串的長度。我的修補程序所做的是告訴查詢打印從第9個字符開始的所有內容,直到m字母的位置,這會導致所需的任務時間。

1

我曾嘗試後-

regexp_substr ('task1 - 1234m', '[^ _ ]+',1, 3) --results 1234m 
  • 該分成兩個部分

    1. 第一拾取字符串取字符串的數目部分從第一

      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%' 
    
    相關問題