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我没有忘记你。只要调整一下逻辑开关约翰,我很感激。谢谢你的帮助