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

时间:2015-10-01 09:11:37

标签: sql oracle substring

我正在努力解决Oracle SQL中的查询问题,希望从存储在Oracle数据库中的某些文本中获取一些时间。

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条记录以&#39; 6m&#39;结尾),也许最好考虑这些值可能是:< / p>

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

6 个答案:

答案 0 :(得分: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>

答案 1 :(得分:2)

你也可以这样使用

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


result :666

答案 2 :(得分:1)

您可以使用the regex_substr function\d+表示一个或多个数字,$锚定字符串的结尾。

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

Example at SQL Fiddle.

答案 3 :(得分:1)

为了纠正您当前的查询,您应该更改以下字符串 - “INSTR(myString,'m',1,1)-1”到“INSTR(myString,'m',1,1)-9 ”。 但是,上面提供的其他答案似乎是一个更优雅的解决方案。

我确实觉得有必要发布这个只是为了澄清当前查询中哪些效果不好 - 在INSTR函数中返回m字母的位置,然后用作要打印的字符串的长度。我的修复方法是告诉查询打印从第9个字符到m字母位置的所有内容,这将导致所需的任务时间。

答案 4 :(得分:1)

我试图将其分为两部分

  1. 首先在-

    之后选择字符串
      regexp_substr ('task1 - 1234m', '[^ _ ]+',1, 3) --results 1234m
    
  2. 获取从第一个

    输出中获取的字符串的数字部分
     regexp_substr(regexp_substr ('task1 - 1234m', '[^ _ ]+',1, 3),'[[:digit:]]*') 
     --output 1234
    
  3. 所以,最后的查询是

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

答案 5 :(得分:1)

使用此: -

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