SQL 甲骨文 |我如何 select 以某个字母开头并以某个符号结尾的子字符串?

SQL Oracle | How would I select a substring where it begins with a certain letter and ends with a certain symbol?

如果我有这个:

NAME        EYES==ID==HAIR
Jon         Brown==F9182==Red
May         Blue==F10100==Brown
Bill        Hazel/Green==F123==Brown

...我想创建一个只有 ID 的新 ID 列,而且我知道每个人的 ID 都以 'F' 开头,并以“=”结尾 我该如何 select 紧凑列中的一个子字符串并仅取出 ID?

例如。我想要这个作为最终产品

NAME        EYES==ID==HAIR               ID
Jon         Brown==F9182==Red            F9182
May         Blue==F10100==Brown          F10100
Bill        Hazel/Green==F123==Brown     F123

如果我不能让它在“=”处结束,有什么方法可以 trim 在 select 之后不属于 ID 的其余内容?

    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 作为你的 table 名字。

学习者提取中间单词的最简单方法之一是使用 INSTR()SUBSTR()

您可以使用正则表达式:

regexp_substr('Hazel/Green==F123==Brown','(==F.+?==)')

提取“==F123==”,现在 trim =:

ltrim(rtrim(regexp_substr('Hazel/Green==F123==Brown','(==F.+?==)'), '='), '=')

如果 Oracle 支持 lookahead/lookbehind 这会更容易...

编辑:

根据@ErkanHaspulat 的查询,您不需要 LTRIM/RTRIM,因为您可以仅指定 return 第一个捕获组(我总是忘记这一点)。但为了安全起见,您应该将正则表达式更改为不贪心:

regexp_substr('Hazel/Green==F123==Brown==iii','==(.+?)==', 1, 1, null, 1)

我们的想法是使用正则表达式找到您想要的字符串部分。在下面的查询中,请注意在给定正则表达式中定义子表达式的 () 字符。那是神奇的部分;您可以在正则表达式中使用任意数量的子表达式,并使用 regexp_substr 函数的最终参数 select 它们。

详情见documentation

with sample_data as(
    select 
    'Brown==F9182==Red' text
    from dual)
select
    text
    ,regexp_substr(text, '==(.+)==', 1, 1, null, 1)
from sample_data

使用 REGEXP_SUBSTR 以及 LTRIMRTRIM

的组合
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 Fiddle: http://sqlfiddle.com/#!4/ebc01/17/0