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

Posted

技术标签:

【中文标题】Oracle sql:仅获取子字符串的特定部分【英文标题】:Oracle sql : get only specific part of a substring 【发布时间】:2015-12-29 06:40:12 【问题描述】:

我正在努力处理 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'

【问题讨论】:

看起来这可以简化为在第二次出现的空格和最后一次出现的空格之间找到字符串,但不包括在内。 没问题,您可以简单地使用 SUBSTR 和 INSTR 并使其动态化。使用您编辑的值查看编辑后的答案。 【参考方案1】:

使用 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 substr(replace(myString,'m',''),9) output
from kde_test
where myString like 'task%'

【讨论】:

【参考方案3】:

我试着把它分成两部分

    先挑-后面的字符串

      regexp_substr ('task1 - 1234m', '[^ _ ]+',1, 3) --results 1234m
    

    获取从第一个输出中获取的字符串的数字部分

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

所以,最终的查询是

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

你也可以这样用

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


result :666

【讨论】:

【参考方案6】:

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

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

Example at SQL Fiddle.

【讨论】:

以上是关于Oracle sql:仅获取子字符串的特定部分的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 如果一条记录具有特定值,则仅获取该记录,否则获取全部

如何在 Oracle SQL 中选择一个子字符串直到一个特定的字符?

ORACLE如何查询字符串的真正长度

Oracle SQL:对 CASE WHEN 重复使用子查询,而无需重复子查询

如何仅使用 javascript 获取特定 div/form 的所有子输入?

SQL - 从字符串中获取特定文本