如果我有这个:
NAME EYES==ID==HAIR
Jon Brown==F9182==Red
May Blue==F10100==Brown
Bill Hazel/Green==F123==Brown
...我想创建一个只有ID的新ID列,我知道每个人的ID都以'F'开头,并以'='结束我如何从紧凑列中选择一个子串并把JUST拿出来?
离。我希望这是最终产品
NAME EYES==ID==HAIR ID
Jon Brown==F9182==Red F9182
May Blue==F10100==Brown F10100
Bill Hazel/Green==F123==Brown F123
如果我无法以“=”结束,那么选择它后是否有任何方法可以修剪不属于ID的其他内容?
答案 0 :(得分:2)
您可以使用正则表达式:
regexp_substr('Hazel/Green==F123==Brown','(==F.+?==)')
提取'== F123 ==',现在修剪=
:
ltrim(rtrim(regexp_substr('Hazel/Green==F123==Brown','(==F.+?==)'), '='), '=')
如果Oracle支持前瞻/后视这将更容易......
编辑:
基于@ ErkanHaspulat的查询,您不需要LTRIM / RTRIM,因为您可以指定仅返回第一个捕获组(我总是忘记这一点)。但为了安全起见,你应该改变正则表达式而不是贪婪:
regexp_substr('Hazel/Green==F123==Brown==iii','==(.+?)==', 1, 1, null, 1)
答案 1 :(得分:2)
我们的想法是使用正则表达式找到所需字符串的一部分。在下面的查询中,请注意定义给定正则表达式中的子表达式的()
个字符。那是神奇的部分;您可以在正则表达式中使用所需数量的子表达式,并使用regexp_substr
函数的最终参数选择它们。
有关详细信息,请参阅documentation。
with sample_data as(
select
'Brown==F9182==Red' text
from dual)
select
text
,regexp_substr(text, '==(.+)==', 1, 1, null, 1)
from sample_data
答案 2 :(得分:2)
使用REGEXP_SUBSTR
和LTRIM
&组合RTRIM
SELECT name, EYESIDHAIR, LTRIM(RTRIM(REGEXP_SUBSTR(EYESIDHAIR,'(==F.+?==)'), '='),'=') AS ID
FROM yourtable
输出:
NAME EYESIDHAIR ID
Jon Brown==F9182==Red F9182
May Blue==F10100==Brown F10100
Bill Hazel/Green==F123==Brown F123
答案 3 :(得分:0)
UPDATE table
set ID = substr(EYES==ID==HAIR,
INSTR(EYES==ID==HAIR,'=',1,2)+1,
(INSTR(EYES==ID==HAIR,'=',1,3)-INSTR(EYES==ID==HAIR,'=',1,2)-1))
where primary_key = primary_key;
让它变得简单......
将primary_key
替换为您设置为主键的列
和table
作为您的表名。
学习者在中间提取单词的最简单方法之一是使用INSTR()
和SUBSTR()
。