Sql 取空格和点之间的值

Sql 取空格和点之间的值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有这种弦 1. "Drs. H. Ahmad Malik S.Kom S.E S.pd" 2. "H. Ahmad Abdul Malik S.Kom S.E S.pd" 预期产出: 1. Ahmad Malik 2. Ahmad Abdul Malik 有谁能帮我解决这个问题吗?我试过使用substring、patindex,但始终没有得到预期的输出几乎任何解析/拆分函数都能做到这一点 带有解析/拆分功能的选项1 Declare @YourTable table (ID int,Name

我有这种弦

1. "Drs. H. Ahmad Malik S.Kom S.E S.pd"
2. "H. Ahmad Abdul Malik S.Kom S.E S.pd"
预期产出:

1. Ahmad Malik
2. Ahmad Abdul Malik

有谁能帮我解决这个问题吗?我试过使用substring、patindex,但始终没有得到预期的输出

几乎任何解析/拆分函数都能做到这一点

带有解析/拆分功能的选项1

Declare @YourTable table (ID int,Name varchar(100))
Insert Into @YourTable values
(1,'Drs. H. Ahmad Malik S.Kom S.E S.pd'),
(2,'H. Ahmad Abdul Malik S.Kom S.E S.pd')

Select A.*
      ,B.*
 From  @YourTable A
 Cross Apply (
              Select NewString = Stuff((Select  ' ' +RetVal 
                From [dbo].[udf-Str-Parse](A.Name,' ') 
                Where RetVal Not Like '%.%'
             Order by RetSeq
             For XML Path ('')),1,1,'')
  ) B
Select A.*
      ,B.*
 From  @YourTable A
 Cross Apply (
              Select NewString = Stuff((Select  ' ' +RetVal 
                From (
                        Select RetSeq = Row_Number() over (Order By (Select null))
                              ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                        From  (Select x = Cast('<x>' + replace((Select replace(A.Name,' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                        Cross Apply x.nodes('x') AS B(i)
                     ) B1
                Where RetVal Not Like '%.%'
             Order by RetSeq
             For XML Path ('')),1,1,'')
  ) B
ID  Name                                  NewString
1   Drs. H. Ahmad Malik S.Kom S.E S.pd    Ahmad Malik 
2   H. Ahmad Abdul Malik S.Kom S.E S.pd   Ahmad Abdul Malik 
不带解析/拆分功能的选项2

Declare @YourTable table (ID int,Name varchar(100))
Insert Into @YourTable values
(1,'Drs. H. Ahmad Malik S.Kom S.E S.pd'),
(2,'H. Ahmad Abdul Malik S.Kom S.E S.pd')

Select A.*
      ,B.*
 From  @YourTable A
 Cross Apply (
              Select NewString = Stuff((Select  ' ' +RetVal 
                From [dbo].[udf-Str-Parse](A.Name,' ') 
                Where RetVal Not Like '%.%'
             Order by RetSeq
             For XML Path ('')),1,1,'')
  ) B
Select A.*
      ,B.*
 From  @YourTable A
 Cross Apply (
              Select NewString = Stuff((Select  ' ' +RetVal 
                From (
                        Select RetSeq = Row_Number() over (Order By (Select null))
                              ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                        From  (Select x = Cast('<x>' + replace((Select replace(A.Name,' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                        Cross Apply x.nodes('x') AS B(i)
                     ) B1
                Where RetVal Not Like '%.%'
             Order by RetSeq
             For XML Path ('')),1,1,'')
  ) B
ID  Name                                  NewString
1   Drs. H. Ahmad Malik S.Kom S.E S.pd    Ahmad Malik 
2   H. Ahmad Abdul Malik S.Kom S.E S.pd   Ahmad Abdul Malik 
有兴趣的UDF

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(25))
Returns Table 
As
Return (  
    with   cte1(N)   As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
           cte2(N)   As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 a,cte1 b,cte1 c,cte1 d) A ),
           cte3(N)   As (Select 1 Union All Select t.N+DataLength(@Delimiter) From cte2 t Where Substring(@String,t.N,DataLength(@Delimiter)) = @Delimiter),
           cte4(N,L) As (Select S.N,IsNull(NullIf(CharIndex(@Delimiter,@String,s.N),0)-S.N,8000) From cte3 S)

    Select RetSeq = Row_Number() over (Order By A.N)
          ,RetVal = LTrim(RTrim(Substring(@String, A.N, A.L)))
    From   cte4 A
);
--Orginal Source http://www.sqlservercentral.com/articles/Tally+Table/72993/
--Much faster than str-Parse, but limited to 8K
--Select * from [dbo].[udf-Str-Parse-8K]('Dog,Cat,House,Car',',')
--Select * from [dbo].[udf-Str-Parse-8K]('John||Cappelletti||was||here','||')

更新以获取新信息

Declare @YourTable table (ID int,Name varchar(100))
Insert Into @YourTable values
(4,'Drs. H. Ahmad Malik A. N. S.Kom S.E S.pd'),
(1,'Drs. H. Ahmad Malik S.Kom S.E S.pd'),
(2,'H. Ahmad Abdul Malik S.Kom S.E S.pd'),
(3,'Drs. H. Ahmad Malik S.Kom S.E S.pd')

Select A.*
      ,C.*
 From  @YourTable A
 Cross Apply (Select * From [dbo].[udf-Str-Parse](A.Name,'S.Kom') Where RetSeq=1) B
 Cross Apply (
              Select NewString = Stuff((Select  ' ' +RetVal 
                                        From (
                                              Select *,Excl=min(Flag) over (Order By RetSeq)
                                               From (Select *,Flag=case when charindex('.',RetVal)>0 then 1 else 0 end From [dbo].[udf-Str-Parse](B.RetVal,' ') ) C1
                                             ) C2
                                        Where Excl=0
                                        Order by RetSeq
                                        For XML Path ('')),1,1,'')
             ) C
返回

ID  Name                                        NewString
1   Drs. H. Ahmad Malik S.Kom S.E S.pd          Ahmad Malik
2   H. Ahmad Abdul Malik S.Kom S.E S.pd         Ahmad Abdul Malik
3   Drs. H. Ahmad Malik S.Kom S.E S.pd          Ahmad Malik
4   Drs. H. Ahmad Malik A. N. S.Kom S.E S.pd    Ahmad Malik A. N.   << Notice A. N.
ID Name新闻字符串
1 H.Ahmad Malik S.Kom S.E S.pd Ahmad Malik博士
2 H.Ahmad Abdul Malik S.Kom S.E S.pd Ahmad Abdul Malik
3 H.Ahmad Malik S.Kom S.E S.pd Ahmad Malik博士

4艾哈迈德·马利克博士A.N.S.Kom S.E S.pd艾哈迈德·马利克博士A.N.我忘了加上“艾哈迈德·马利克博士S.Kom S.E S.pd”就行了,但如果是“艾哈迈德·马利克博士A.N.S.Kom S.E S.pd”就不行了。预期的结果是Ahmad Malik A.N.A.N.这是他名字的一部分,而不是他的学位。@MuhammadIdrus我会在我的国家多做一点,如果有人去朝觐,他们会在他的名字前面贴上H.他的名字的标题。如果他们毕业于学士学位,他们就可以名副其实地获得学位,比如S.KOM、S.pd等等。他的名字是abdul malik abdul karim,他总是写下他的名字abdul malik A.K。我想去掉前面和后面的学位,但保留他的名字。@MuhammadIdrus,这很有帮助。给我几分钟来做这件事out@MuhammadIdrus我没有忘记你。只要调整一下逻辑开关约翰,我很感激。谢谢你的帮助