Sql server 将泰语名称解析为First-Last
我需要将全名列表解析为名字和姓氏。如果包含中间名,则应将其包含在First name字段中 约翰·史密斯会是: 名字=约翰 姓氏=史密斯 约翰·J·史密斯会是: 名字=约翰J 姓氏=史密斯 问题是名称可能是泰语或英语字符集。我需要正确解析这两个集合。我已经试过了所有的方法Sql server 将泰语名称解析为First-Last,sql-server,sql-server-2008,string-parsing,thai,Sql Server,Sql Server 2008,String Parsing,Thai,我需要将全名列表解析为名字和姓氏。如果包含中间名,则应将其包含在First name字段中 约翰·史密斯会是: 名字=约翰 姓氏=史密斯 约翰·J·史密斯会是: 名字=约翰J 姓氏=史密斯 问题是名称可能是泰语或英语字符集。我需要正确解析这两个集合。我已经试过了所有的方法 DECLARE @FullName NVARCHAR(MAX) = N'กล้วยไม้ สวามิวัศดุ์' --DECLARE @FullName NVARCHAR(MAX) = N'Mark C. Wilson'
DECLARE @FullName NVARCHAR(MAX) = N'กล้วยไม้ สวามิวัศดุ์'
--DECLARE @FullName NVARCHAR(MAX) = N'Mark C. Wilson'
SELECT
LEN(@FullName) AS StringLength,
LEN(@FullName) - LEN(REPLACE(@FullName,N' ', N'')),
LEN(REPLACE(@FullName,N' ', N'')),
@FullName AS FullName,
REVERSE(@FullName) AS ReverseName, -- This is obviously no Reverse of the string
CHARINDEX(N' ', REVERSE(@FullName)) AS LastSpaceLocation,
CHARINDEX(N' ', @FullName) AS FirstSpaceLocation,
LEN(@FullName) AS LenString,
STUFF(@FullName, 1, CHARINDEX(N' ', @FullName), N'') as FirstName,
RIGHT(@FullName, LEN(@FullName) - CHARINDEX(N' ', @FullName) + 1) as LastName,
LEFT(@FullName, LEN(@FullName) - CHARINDEX(N' ', REVERSE(@FullName))) AS FirstName,
STUFF(RIGHT(@FullName, CHARINDEX(N' ', REVERSE(@FullName))),1,1,N'') AS LastName,
LEN(@FullName),
REVERSE(@FullName),
REVERSE(' '),
LEN(@FullName) - CHARINDEX(reverse(' '), REVERSE(@FullName)) - LEN(' ') + 1
当使用泰语字符集时,反向
根本不起作用。我看不懂泰语(我不是那么聪明),但这可能会有所帮助
这里我们使用交叉应用程序来“修复”字符串,然后是一个小问题PasrName()
和Concat()
我应该补充一点,解析名称是一个滑铁卢。需要考虑
- 多字姓氏,即德拉克鲁兹
- 后缀,即Richard R Cappelletti医学博士
Declare @YourTable table (FullName nvarchar(100))
Insert Into @YourTable values
('John Smith')
,('John J. Smith')
,(N'กล้วยไม้ สวามิวัศดุ์')
Select A.*
,LastName = replace(parsename(S,1),'|','.')
,FirstName = replace(concat(parsename(S,4),' '+parsename(S,3),' '+parsename(S,2)),'|','.')
From @YourTable A
Cross Apply ( values (replace(replace(FullName,'.','|'),' ','.'))) B(S)
返回
FullName LastName FirstName
John Smith Smith John
John J. Smith Smith John J.
กล้วยไม้ สวามิวัศดุ์ สวามิวัศดุ์ กล้วยไม้
编辑2008版
Select A.*
,LastName = replace(parsename(S,1),'|','.')
,FirstName = replace( IsNull(parsename(S,4),'') + IsNull(' '+parsename(S,3),'') + IsNull(' '+parsename(S,2),''),'|','.')
From @YourTable A
Cross Apply ( values (replace(replace(FullName,'.','|'),' ','.'))) B(S)
我是泰国人,我知道泰国人不使用中间名。之所以会出现这种情况,是因为将泰语名颠倒会使组合字符出错,这些字符会“附着”在空格上,导致简单的词典搜索失败。在某种程度上,您可以通过强制二进制排序来“修复”这个问题(
selectcharindex(N'),REVERSE(N')กล้วยไม้ สวามิวัศดุ์') 整理拉丁语(1\u General\u BIN2)
),但你很可能会遇到其他奇怪的事情。一旦你开始扩展到更多的语言(如日语,或其他名称成分顺序与英语不同的语言,或根本没有姓氏)只会在可能的情况下留下名字。你似乎有这个问题,并且现有的答案已经证明了你基于反向字符串的方法从根本上是有缺陷的,并且应该被修改。很明显,你已经改进了查询,因为最初的问题被问了,但是问题仍然存在。这是一样的,所以你可能需要编辑原始的Q而不是问一个新的。VTC/duplicate.mable duplicate of我看到了这个,它不是解决我问题的有效方法。Reverse()无法正确处理字符集。很抱歉,但不幸的是,这是在SS 2008数据库中。我意识到这已接近生命的尽头,但……无论如何,SQL Server 2012中引入了concat。@Mark:幸运的是concat
在这种情况下只是处理NULL
s的一种方便。将字符串与+
并用ISNULL(…,'')包装连接的表达式
将其降级。@Mark Seed EDIT 2008Version@Mark只是说…2008年的扩展支持将于2019年7月结束。请用2008标记您的问题,以避免假设。有趣的事实…没有中间名的东西我是荷兰人,我有两个。我从来没有提到过它们,因为我不希望任何代码,尤其是所有数据库代码都正确. :-)