0

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

汤姆史密斯

安德鲁·史密斯

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

T·史密斯

A.史密斯

4

3 回答 3

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;

这两个都处理单字名称,例如Princeor Madonna- 但它们不能正确处理您有中间名的情况。这种情况下的问题将是:

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

您如何确定其中哪些是中间名,哪些具有多字姓氏?如果您正在处理这种情况,请开始更用力地握拳。

于 2012-08-30T03:31:55.230 回答
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
于 2012-08-30T06:35:49.983 回答
0

这应该有效:

SELECT SUBSTRING(nameCol, 1, 1) + '.' + SUBSTRING(nameCol, CHARINDEX(' ', nameCol), 100)
于 2012-08-30T03:35:00.630 回答