如何将名字修剪为单个字符?

时间:2012-08-30 03:28:54

标签: sql sql-server-2008 tsql

我有一个列以全名格式存储数据,例如:

  汤姆史密斯

     

Andrew Smith

是否有一个函数(或函数组合)可用于将其转换为以下内容:

  

吨。史密斯

     

一个。史密斯

3 个答案:

答案 0 :(得分:5)

应该分别存储名字和姓氏。与此同时:

SELECT CASE WHEN FullName LIKE '% %' THEN 
  LEFT(FullName, 1) + '.' + SUBSTRING(FullName, CHARINDEX(' ', FullName), 255)
    ELSE FullName END
  FROM dbo.table;

另一种选择:

SELECT COALESCE(LEFT(FullName, 1) 
  + '.' + SUBSTRING(FullName, NULLIF(CHARINDEX(' ', FullName), 0), 255), 
  FullName)
FROM dbo.table;

这两个字都涉及PrinceMadonna这样的单字名称,但它们无法正确处理您拥有中间名称的情况。那种情况下的问题是:

John Wayne Bobbitt
Billy Ray Cyrus
Lisa Van der Wal
Lee Harvey Oswald
Dennis Moseley Williams
James de Caan

如何确定哪些是中间名,哪些是多字姓?如果你正在处理这种情况,那就开始更加努力地摇动你的拳头了。

答案 1 :(得分:1)

Declare @t table(FullName Varchar(100))
Insert Into @t Values('Tom Smith'),('Andrew Smith'),('  Andrew '),('John Wayne Bobbitt'),(NULL)

<强> - 解决方案

SELECT 
    NewName = CASE WHEN CHARINDEX(' ', LTRIM(RTRIM(FullName))) > 0 THEN LEFT(LTRIM(RTRIM(FullName)),1)
              + '.'
              +SUBSTRING((LTRIM(RTRIM(FullName))),CHARINDEX(' ', LTRIM(RTRIM(FullName))),LEN(FullName))
         ELSE LTRIM(RTRIM(FullName))
    END
FROM @t

//结果

<强>新名称

T. Smith
A. Smith
Andrew
J. Wayne Bobbitt
NULL

答案 2 :(得分:0)

这应该有效:

SELECT SUBSTRING(nameCol, 1, 1) + '.' + SUBSTRING(nameCol, CHARINDEX(' ', nameCol), 100)