我在将SQL Server 2017中的名字与中间名列分开时遇到麻烦

时间:2019-09-03 08:26:35

标签: sql sql-server sql-server-2017

我创建了此语法,以从名为invertornames的列中分离出名字,中间名和姓氏。仅需注意,投资者名称使用阿拉伯语,中间名称超过3个字。效果很好,但是名字也包含在中间名中,如下图所示

enter image description here

这是我写的查询:

SELECT
    SUBSTRING(investor_name, CHARINDEX(', ', investor_name) + 2, CASE WHEN CHARINDEX(' ', investor_name, CHARINDEX(', ', investor_name) + 2) = 0 THEN LEN(investor_name) + 1 ELSE CHARINDEX(' ', investor_name, CHARINDEX(', ', investor_name) + 2) END - CHARINDEX(', ', investor_name) - 2)AS FirstName,                
    RTRIM(LTRIM(REPLACE(REPLACE(investor_name,SUBSTRING(investor_name , 1, CHARINDEX(' ', investor_name) -1),''),REVERSE( LEFT( REVERSE(investor_name), CHARINDEX(' ', REVERSE(investor_name))-1 ) ),''))) AS MiddleName,    
    RIGHT(investor_name, CHARINDEX(' ', REVERSE(investor_name))) AS LastName    
FROM
    investornames

如果您需要任何数据尝试,请告诉我。

1 个答案:

答案 0 :(得分:0)

您可以尝试一下。我认为第一个单词被视为Firstname,第二个单词被视为MiddleName,其余单词将被视为LastName

对于arabic names。软件不会自动检测名称是从头开始的,而是反向进行的。所以我想您需要维护一个标志。

cte部分使用阿拉伯名称的情况下,请使用reverse以从左到右的顺序而不是从右到左的顺序排列它们。最后,再次使用reverse函数将其转换为原始状态。

希望我很清楚自己在解释什么。示例代码如下:-

; with cte as (
select 'Deepak kumar singh' as names
union
select 'Deep'
union 
select 'deep kumar'
union 
select 'Deepak kumar singh chandel')
SELECT 
Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 1)) As [FirstName]
, Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 2)) As [MiddleName]
, case when len( Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 3)))>0 then substring ( names ,
charindex ( Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 2)) + ' ', names) + len(Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 2)) + ' ') + 1
, len(names) - charindex ( Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 2)) + ' ', names) + len(Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 2)) + ' ')) else null end
 As [LastName]
FROM  (Select names from cte ) As [x] 


上述查询的结果是:

FirstName   MiddleName  LastName
Deep        NULL        NULL
deep        kumar       NULL
Deepak      kumar       singh
deepak      kumar       singh chandel

修改

更新了此检查并对此进行了检查

; with cte as (
select ' شركة عبدالمحسن عبدالعزيزالبابطين ' as names
union
select 'شركة'
union 
select 'عبدالمحسن عبدالعزيز'
union 
select 'البابطين')
, ct as (
select RTRIM(LTRIM(names)) as Names from cte )
SELECT 
Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 1)) As [FirstName]
, Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 2)) As [MiddleName]
, case when len( Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 3)))>0 then substring ( names ,
charindex ( Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 2)) + ' ', names) + len(Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 2)) + ' ') + 1
, len(names) - charindex ( Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 2)) + ' ', names) + len(Reverse(ParseName(Replace(Reverse(names), ' ', '.'), 2)) + ' ')) else null end
 As [LastName]
FROM  (Select names from ct ) As [x] 

结果

FirstName   MiddleName   LastName
????        ?????????    ?????????????????
????        NULL         NULL
????????    NULL         NULL
?????????   ?????????    NULL

在这里,我期望您能代替?得到您的结果。顺便说一句,我已经更新了查询,您是否尝试过此查询。再试一次。

enter image description here