用于拆分名称的SQL - 一些具有中间初始值,一些没有

时间:2014-01-30 15:22:48

标签: sql sql-server

我对SQL很新,我实际上只是在Access中构建一个小型数据库,尽管如果有必要的功能,Access无法做到,我将在SQL Server中重新制作表。

这是我的情况,我有一个来自第三方数据转储的名单。在我们的数据库中,我需要能够在单独的列中比较名字和姓氏。

我一直在尝试使用InStr,左和右 - 但我的结果很奇怪

Left([NewClaims]![Claimant Full Name],InStr([NewClaims]![Claimant Full Name],",")-1) AS LastName, 
Right([NewClaims]![Claimant Full Name],InStr([NewClaims]![Claimant Full Name], ", ")+2) AS FirstName,

在某些名称上它完美运作

West, Krystal --becomes--> LastName = West, FirstName= Krystal

关于其他名称,在共振峰中类似,它不起作用

Dalton, Kathy ----> LastName = Dalton, First Name = ON, KATHY

在具有中间姓名首字母的姓名上我得到

Earles, Barbara A. ----> LastName = Earles, FirstName= ARBARA A. (one missing letter) 

OR

Beard, Chekitha G. ----> LastName = Beard, FirstName= KITHA G. (three missing letters)

我很沮丧。谁能提供关于如何使这项工作的另一个想法?我似乎有姓氏,但我不能让第一个名字始终正确。

1 个答案:

答案 0 :(得分:2)

试试这个。但我假设总是用逗号分隔姓氏和名字。

select
    txt,
    LastName = left(txt,charindex(',',txt)-1),
    FirstName = ltrim(right(txt,len(txt)-charindex(',',txt)))
from (
    select 'West, Krystal' as txt union all
    select 'Dalton, Kathy' union all
    select 'Earles, Barbara A.' union all
    select 'Beard, Chekitha G.'
) x

您的错误在于,当使用right提取名字时,您没有考虑字符串的长度。