sql截取第2个和第3个分隔符之间的字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql截取第2个和第3个分隔符之间的字符串相关的知识,希望对你有一定的参考价值。

分隔符:<br>
字符串(例):1<br>23<br>456<br>7890
现在要取数据456(长度不定)即第2个<br>和第3个<br>之间的字符串
用sql怎么写
另外 这只是所有数据中的一行余下的也是做同样的处理
数据库 sqlserver 2008 r2

select substring('1<br>23<br>456<br>7890',CHARINDEX('1<br>23<br>456<br>7890','<br>',1,2)+4,(CHARINDEX('1<br>23<br>456<br>7890','<br>',1,3)-CHARINDEX('1<br>23<br>456<br>7890','<br>',1,2)-4)) from table

这是sqlserver的函数了
思路就是:获取第2个<br>的位置,加4(<br>这个字符串的长度),然后截取其之后到第三个<br>的长度的字符串。
这是substring 的api
SUBSTRING(string,start_position,[length])    求子字符串,返回字符串
解释:string 元字符串
       start_position   开始位置(从0开始)
       length 可选项,子字符串的个数

追问

别的暂且不管,啥时CHARINDEX()有四个参数了。。。。。。

追答

这个,instr是四个参数的。

charindex没有第四个参数,那就要用嵌套了。
charindex('abc','a',charindex('abc','a',1)+1);这种模式

参考技术A 写一个函数,获取出两个分割符间的内容。charindex获取分割符位置,结合Left和Right追问

大哥,能具体点么?

参考技术B substr('字符串',

locate('<br>','字符串',locate('<br>','字符串')+1)+1,

locate('<br>','字符串', locate('<br>','字符串',locate('<br>','字符串')+1)+1))
有点乱,第二行是截取第二个分割符出现的位置+1,以此类推,一般超过第4个位置就写函数了,可以百度下,很多本回答被提问者采纳
参考技术C create table #a(id int identity,col nvarchar(200))
insert into #a(col)
values('1<br>23<br>456<br>7890'),('1<br>456<br>3<br>55'),('34<br>1<br>43<br>2')

;with cte as(
select *,convert(xml,'<br>'+rtrim(replace(col,'<br>','</br><br>'))+'</br>') as col2 from #a
)select id,col2.value('(/br)[3]','nvarchar(max)') as col from cte

id col
----------- ------------
1 456
2 3
3 43

如何使用CHARINDEX和SUBSTRING在第二个和第三个“_”之间提取特定文本?

如何编写SQL脚本以从“Email_Transport_Cabforce_NEB_Fallback_LB”中获取“Cabforce”?

我在下面找到了解决方案,以获取第一个_和最后一个_之间的所有单词,但未能将其转换为在第二个_和第三个_之间获取字符串。

DECLARE @c varchar(100)
SET     @c = 'Email_Transport_Cabforce_NEB_Fallback_LB' 

SELECT SUBSTRING(
    @c, 
    CHARINDEX('_', @c) + 1, 
    LEN(@c) - CHARINDEX('_', @c) - CHARINDEX('_', REVERSE(@c))
)
答案

这显示了如何构建它:我把它分解成碎片;你可以看到逻辑并把它全部放回一个表达式中:

DECLARE @c varchar(100) SET @c = 'Email_Transport_Cabforce_NEB_Fallback_LB'

DECLARE @firstIndex int = CHARINDEX('_', @c) + 1
DECLARE @secondIndex int = CHARINDEX('_', @c, @firstIndex) + 1
DECLARE @thirdIndex int = CHARINDEX('_', @c, @secondIndex) + 1

SELECT SUBSTRING( @c, @secondIndex, @thirdIndex - @secondIndex - 1)
另一答案

这有点长,但你可以这样做。它找到第一个下划线的位置,然后将其用作下一个CHARINDEX计算的开始。然后它再次为第三个CHARINDEX做这个。最后两次计算的结果用作SUBSTRING的工作方式。

DECLARE @c VARCHAR(100); SET @c = 'Email_Transport_Cabforce_NEB_Fallback_LB'

SELECT
@C Variable
,SUBSTRING(@c,CHARINDEX('_',@c,CHARINDEX('_',@c)+1)+1,(CHARINDEX('_',@c,CHARINDEX('_',@c,CHARINDEX('_',@c)+1)+1)-CHARINDEX('_',@c,CHARINDEX('_',@c)+1))-1) Result

产量

Variable                                    Result
Email_Transport_Cabforce_NEB_Fallback_LB    Cabforce

如果你的输出不能包含下划线,那么使用这个;

DECLARE @c VARCHAR(100); SET @c = 'Email'
IF NOT EXISTS (SELECT 1 WHERE CHARINDEX('_',@c) < 2)
BEGIN
SELECT
@C Variable
,SUBSTRING(@c,CHARINDEX('_',@c,CHARINDEX('_',@c)+1)+1,(CHARINDEX('_',@c,CHARINDEX('_',@c,CHARINDEX('_',@c)+1)+1)-CHARINDEX('_',@c,CHARINDEX('_',@c)+1))-1) Result
END
ELSE
SELECT @c Result

产量

Result
Email

以上是关于sql截取第2个和第3个分隔符之间的字符串的主要内容,如果未能解决你的问题,请参考以下文章

请问如何在Oracle中截取第一个逗号和第二个逗号之间的字符串

在第二个和第三个连字符之间提取 TextString

javascript 如何截取两个逗号之间的字符串

如何使用CHARINDEX和SUBSTRING在第二个和第三个“_”之间提取特定文本?

SQL截取字符串分隔符中间部门的办法

Linux字符串截取和处理命令 cutprintfawksedsortwc