2017-03-08 107 views
0

我想提取列值的特定部分。 目标列和值看起来像在Oracle SQL中提取列值的特定部分

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

将得到的柱看起来应该像

RESULT_COL 
--------------- 
10MG 
200MG 
135MG 
+0

您需要更清楚地了解要求。什么是规则/算法?例如,它可能是1.每第二次工作; 2.第一个字以数字开头; 3.任何使用MG作为后缀的工作......等 – BobC

+0

我在提问时没有想到算法。但我相信所需数据可以通过颠倒列值来提取,然后找到类似'MG%''直到空间出现。虽然我不知道如何将算法放入实际的SQL格式。 – AghaKhan

+0

它是否总是一个数字,然后是你想提取的MG? –

回答

1

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

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

注意,这是区分大小写的,它总是返回第一比赛。

+0

这也假定中期使用毫克作为度量单位,这可能并非总是如此。 –

2

我可能会接近这个使用REGEXP_SUBSTR(),而不是基地的功能,因为处方文本的结构与变化记录。

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

图案(\s)(\S*)将匹配单个空格,随后通过任何数目的非空格字符。这应该与所有情况下的第二项匹配。我们使用TRIM()删除匹配并返回的前导空间。

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; 

编辑:固定的正则表达式包括表达式在解析后的文本后没有空格。比较遗憾的是..;)

+0

您的'REGEXP_SUBSTR()'有问题。你看到它是什么吗? –

+0

@TimBiegeleisen,是的。固定。 –