SQL Oracle |如何选择以某个字母开头并以某个符号结尾的子字符串?

时间:2015-06-15 13:00:13

标签: sql oracle select substring oracle-sqldeveloper

如果我有这个:

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的其他内容?

4 个答案:

答案 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_SUBSTRLTRIM&组合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

SQL小提琴:http://sqlfiddle.com/#!4/ebc01/17/0

答案 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()