我必须按如下所示查找子字符串。
数据如下
aaaa.bbb.ccc.dddd.eee.fff.ggg
qq.eeddde.rrr.t.hh.jj.jj.hh.hh
ee.r.t.y.u.i.ii.
我想要输出为-
bbb
eeeddde
r
我面临的挑战都是用(。)作为分隔符,因此子字符串很难使用。
SELECT SUBSTRING(string,CHARINDEX('.',string)+1,
(((LEN(string))-CHARINDEX('.', REVERSE(string)))-CHARINDEX('.',string))) AS Result
FROM [table]
bbb
eeeddde
r
第一个和第二个之间的子字符串(。)
那么它可能在第二和第三(。)之间
答案 0 :(得分:2)
这是一种方法:
select left(v.str1, charindex('.', v.str1 + '.') - 1)
from t cross apply
(values (stuff(t.string, 1, charindex('.', t.string + '.'), '')
) v(str1)
答案 1 :(得分:2)
我假设(CHARINDEX)这是ms sql服务器。
CROSS APPLY
非常适合进行中间计算。
SELECT t.pos, t1.pos,
SUBSTRING(string, t.pos + 1, t1.pos - t.pos -1) AS Result
FROM [table]
CROSS APPLY ( VALUES(CHARINDEX('.',string)) ) t(pos)
CROSS APPLY ( VALUES(CHARINDEX('.',string, t.pos+1))) t1(pos)
答案 2 :(得分:2)
另一种选择是使用一些XML
示例
Declare @YourTable table (ID int,SomeColumn varchar(max))
Insert Into @YourTable values
(1,'aaaa.bbb.ccc.dddd.eee.fff.ggg')
,(2,'qq.eeddde.rrr.t.hh.jj.jj.hh.hh')
,(3,'ee.r.t.y.u.i.ii.')
Select ID
,SomeValue = convert(xml,'<x>' + replace(SomeColumn,'.','</x><x>')+'</x>').value('/x[2]','varchar(100)')
From @YourTable
返回
ID SomeValue
1 bbb
2 eeddde
3 r
答案 3 :(得分:2)
您可以同时使用left()
,replace()
和charindex()
函数:
select replace(
replace(
left(str,charindex('.',str,charindex('.',str)+1)),
left(str,charindex('.',str)),
''
),
'.'
,''
) as "Output"
from t;