簡體   English   中英

Oracle sql:只獲取子字符串的特定部分

[英]Oracle sql : get only specific part of a substring

我正在努力解決Oracle SQL中的查詢問題,希望從存儲在Oracle數據庫中的某些文本中獲得一些時間。

Table :
kde_test (myString varchar(50))

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

我想只得到字符串的有趣部分,作為時間,所以我想只得到'6','66'和'666'作為結果。

搜索了一下這個論壇,並最終得到了這個查詢,但似乎我沒有完全得到它,因為它返回的結果是:6m 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%'

編輯:

由於一些解決方案(感謝已經快速響應)考慮了具體的值(例如,所有3條記錄以'6m'結尾),也許最好考慮這些值可能是:

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

使用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>

你也可以用這種方式

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


result :666

您可以使用regex_substr函數 \\d+表示一個或多個數字, $錨定字符串的結尾。

select  regexp_substr(str, '\d+m$')
from    mytable

SQL Fiddle的例子。

為了糾正您當前的查詢,您應該將以下字符串 - “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 
  2. 獲取從first的輸出中獲取的字符串的數字部分

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

所以,最后的查詢是

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

用這個:-

select substr(replace(myString,'m',''),9) output
from kde_test
where myString like 'task%'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM