在SQL中查找子字符串

时间:2019-07-02 12:56:06

标签: sql sql-server substring

我必须按如下所示查找子字符串。

数据如下


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

第一个和第二个之间的子字符串(。)

那么它可能在第二和第三(。)之间

4 个答案:

答案 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;

Demo