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
以及 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
SQL Fiddle: http://sqlfiddle.com/#!4/ebc01/17/0
如果我有这个:
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
以及 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
SQL Fiddle: http://sqlfiddle.com/#!4/ebc01/17/0