将全名分为姓氏和名字,然后删除“垃圾邮件”

时间:2019-06-20 18:58:14

标签: sql sql-server

不确定最好的表达方式。所以我有一列名称,如下所示:

SalesPerson_Name
----------------
Undefined - 0
Sam Brett-sbrett
Kelly Roberts-kroberts
Michael Paramore-mparamore
Alivia Lawler-alawler
Ryan Hooker-rhooker
Heather Alford-halford
Cassandra Blegen-cblegen
JD Holland-jholland
Vendor Accounts-VENDOR
Other Accounts-OTHER

使用PARSENAME和REPLACE函数将名称分开很容易,但是我遇到一个麻烦的地方是最后消除了“垃圾”:

SELECT SalesPerson_Key
    ,SalesPerson_Name
    ,CASE 
        WHEN PARSENAME(REPLACE(SalesPerson_Name, ' ', '.'), 2) IS NULL
            THEN PARSENAME(REPLACE(SalesPerson_Name, ' ', '.'), 1)
        ELSE PARSENAME(REPLACE(SalesPerson_Name, ' ', '.'), 2)
        END AS FirstName
    ,CASE 
        WHEN PARSENAME(REPLACE(SalesPerson_Name, ' ', '.'), 2) IS NULL
            THEN NULL
        ELSE PARSENAME(REPLACE(SalesPerson_Name, ' ', '.'), 1)
        END AS LastName
FROM Salesperson

姓氏列的结果:

LastName
--------
0
Brett-sbrett
Roberts-kroberts
Paramore-mparamore
Lawler-alawler
Hooker-rhooker
Alford-halford
Blegen-cblegen
Holland-jholland
Accounts-VENDOR
Accounts-OTHER

特别是,我想删除姓氏末尾的文本(用户ID)。如果名称长度相同,则可以使用RIGHT函数,但长度会有所不同。想法?

3 个答案:

答案 0 :(得分:0)

如果您只想删除姓氏(用户名),则可以使用类似的查询

select
  rtrim(
    substring(
      SalesPerson_Name,
      1,
      charindex('-',SalesPerson_Name,1)-1
    )
  )
from Salesperson

charindex函数可查找您要查找的字符。

答案 1 :(得分:0)

select left(PARSENAME(REPLACE(SalesPerson_Name, ' ', '.'), 1), len(SalesPerson_Name)-CHARINDEX('-',SalesPerson_Name)-1)

您将获得-的charindex并采用它的左字符串。

答案 2 :(得分:0)

考虑是否在hyphen后跟space,并根据这两种情况进行拆分

with Salesperson( SalesPerson_Name ) as
(
 select 'Undefined - 0'              union all
 select 'Sam Brett-sbrett'           union all
 select 'Kelly Roberts-kroberts'     union all
 select 'Michael Paramore-mparamore' union all
 select 'Alivia Lawler-alawler'   
)
select case when substring(SalesPerson_Name,charindex(' ',SalesPerson_Name)+1,1) = '-' then
         substring(SalesPerson_Name,charindex(' ',SalesPerson_Name)+3,len(SalesPerson_Name))
       else
         substring(SalesPerson_Name,charindex(' ',SalesPerson_Name)+1,len(SalesPerson_Name))
       end as last_name          
  from Salesperson s;

last_name
------------------
0
Brett-sbrett
Roberts-kroberts
Paramore-mparamore
Lawler-alawler