在Oracle SQL中提取列值的特定部分

时间:2017-03-08 05:26:25

标签: sql oracle

我想提取列值的特定部分。 目标列及其值看起来像

TEMP_COL
---------------
DESCOL 10MG
TEGRAL 200MG 50S
COLOSPAS 135MG 30S

结果列应该看起来像

RESULT_COL
---------------
10MG
200MG
135MG

3 个答案:

答案 0 :(得分:2)

我可能会使用REGEXP_SUBSTR()而不是基本函数来处理这个问题,因为处方文本的结构因记录而异。

SELECT TRIM(REGEXP_SUBSTR(TEMP_COL, '(\s)(\S*)', 1, 1))
FROM yourTable

模式(\s)(\S*)将匹配单个空格,后跟任意数量的非空格字符。在所有情况下,这应与第二个术语相匹配。我们使用TRIM()删除匹配并返回的前导空格。

答案 1 :(得分:2)

这可以使用正则表达式完成:

SELECT regexp_substr(TEMP_COL, '[0-9]+MG')
FROM the_table;

请注意,这是区分大小写的,它始终返回第一个匹配。

答案 2 :(得分:0)

你怎么知道你要提取的部分是什么?你怎么知道它从哪里开始到哪里结束?使用白色空格?

如果是这样,你可以使用substr来剪切数据,并使用instr来查找空格。

示例:

select substr(tempcol, -- string
              instr(tempcol, ' ', 1), -- location of first white-space 
              instr(tempcol, ' ', 1, 2) - instr(tempcol, ' ', 1))  -- length until next space
from dual

另一个解决方案是使用regexp_substr(但如果你有很多行,那么性能可能会更难):

SELECT REGEXP_SUBSTR (tempcol, '(\S*)(\s*)', 1, 2)
FROM dual;

编辑:修正正则表达式以包含在解析后的文本后没有空格的表达式。抱歉...;)