我想提取列值的特定部分。 目标列和值看起来像在Oracle SQL中提取列值的特定部分
TEMP_COL
---------------
DESCOL 10MG
TEGRAL 200MG 50S
COLOSPAS 135MG 30S
将得到的柱看起来应该像
RESULT_COL
---------------
10MG
200MG
135MG
我想提取列值的特定部分。 目标列和值看起来像在Oracle SQL中提取列值的特定部分
TEMP_COL
---------------
DESCOL 10MG
TEGRAL 200MG 50S
COLOSPAS 135MG 30S
将得到的柱看起来应该像
RESULT_COL
---------------
10MG
200MG
135MG
这可以使用正则表达式来完成:
SELECT regexp_substr(TEMP_COL, '[0-9]+MG')
FROM the_table;
注意,这是区分大小写的,它总是返回第一比赛。
这也假定中期使用毫克作为度量单位,这可能并非总是如此。 –
我可能会接近这个使用REGEXP_SUBSTR()
,而不是基地的功能,因为处方文本的结构与变化记录。
SELECT TRIM(REGEXP_SUBSTR(TEMP_COL, '(\s)(\S*)', 1, 1))
FROM yourTable
图案(\s)(\S*)
将匹配单个空格,随后通过任何数目的非空格字符。这应该与所有情况下的第二项匹配。我们使用TRIM()
删除匹配并返回的前导空间。
你怎么知道你想要提取的部分是什么?你怎么知道它从哪里开始以及它在哪里结束?使用白色空格?
如果是这样,你可以使用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;
编辑:固定的正则表达式包括表达式在解析后的文本后没有空格。比较遗憾的是..;)
您的'REGEXP_SUBSTR()'有问题。你看到它是什么吗? –
@TimBiegeleisen,是的。固定。 –
您需要更清楚地了解要求。什么是规则/算法?例如,它可能是1.每第二次工作; 2.第一个字以数字开头; 3.任何使用MG作为后缀的工作......等 – BobC
我在提问时没有想到算法。但我相信所需数据可以通过颠倒列值来提取,然后找到类似'MG%''直到空间出现。虽然我不知道如何将算法放入实际的SQL格式。 – AghaKhan
它是否总是一个数字,然后是你想提取的MG? –