如何格式化名/姓的顺序并删除前缀和昵称

时间:2015-05-29 20:59:54

标签: sql sql-server

我需要检索管理器的层次结构,并且存储给定人员的管理员名称的列的格式如下Smith, Mr. William (Bill)。我希望这个输出只是William Smith。到目前为止,我把它放在一起:

SELECT DISTINCT RIGHT(u.manager, LEN(u.manager)-(1+CHARINDEX(', ', u.manager))) + ' ' +
LEFT(u.manager, CHARINDEX(', ', u.manager) - 1) as ManagerName
FROM Users u

使用上面示例的查询的当前结果是Mr. William (Bill) Smith。这个CHARINDEX和SUBSTRING的东西总是给我带来很多麻烦,所以我不确定最简单的方法是什么。这也是一次性的,所以我不确定函数在这里是否有用。

3 个答案:

答案 0 :(得分:2)

DEMO

SELECT
  SUBSTRING(manager,0,CHARINDEX(',', manager)) as surname,
  SUBSTRING(manager,CHARINDEX('. ', manager)+2, LEN(manager)-CHARINDEX(' (', manager)+1) as name,
  CONCAT(SUBSTRING(manager,CHARINDEX('. ', manager)+2, LEN(manager)-CHARINDEX(' (', manager)+1),
         ' ',
          SUBSTRING(manager,0,CHARINDEX(',', manager))) as 'name surname'
FROM
  Users

结果:

+-------------+-----------+--------------+
|   surname   |    name   | name surname |
+-------------+-----------+--------------+
    Smith        William    William Smith

答案 1 :(得分:1)

我接受了你的查询并进行了一些修改:

SELECT
    ---this is the tricky part: inner part finds the first instance of '(' parenthesis 
     --and substract it from the length of the first name and get only the left part of the first name by subtracting it
    CONCAT (
        LEFT(t.FirstName, LEN(t.FirstName) - (LEN(t.FirstName) - CHARINDEX('(', t.FirstName) + 1))
        ,t.LastName
        )
FROM (
    --basically separating your above syntax to two columns
    SELECT RIGHT('Smith, Mr. William (Bill)', LEN('Smith, Mr. William (Bill)') - CHARINDEX('.', 'Smith, Mr. William (Bill)') - 1) AS FirstName
        ,LEFT('Smith, Mr. William (Bill)', CHARINDEX(', ', 'Smith, Mr. William (Bill)') - 1) AS LastName
    ) t

以下是适用于您的表名和列的查询:

SELECT
    ---Use case when statement to determine if there are any instances of '(' in the first name
    CONCAT (
    CASE 
        WHEN CHARINDEX('(', t.FirstName) > 0
            THEN LEFT(t.FirstName, LEN(t.FirstName) - (LEN(t.FirstName) - CHARINDEX('(', t.FirstName) + 1))
        ELSE t.FirstName + ' '
        END
    ,t.LastName
    )
FROM (
    SELECT 
    RIGHT(u.manager, LEN(u.manager) - CHARINDEX('.', u.manager) - 1) AS FirstName
    ,LEFT(u.manager, CHARINDEX(', ', u.manager) - 1) AS LastName from Users u
) t

答案 2 :(得分:0)

SELECT RIGHT(NameStripped, LEN(NameStripped) - (1 + CHARINDEX(', ', NameStripped))) + ' ' + LEFT(NameStripped, CHARINDEX(', ', NameStripped) - 1) AS ManagerName --Your original code
FROM (
    SELECT replace(replace(
            LEFT(u.manager, CHARINDEX('(', u.manager) - 2) --Get rid of nickname
        , 'Mr. ', ''), 'Ms.', '') AS NameStripped --Get rid of Mr/Ms
    from MyTable u) a

这应该有效 - 我使用了您发布的代码,但添加了一个子查询来删除昵称和前缀。

请注意,如果a)你有更多的前缀选项(在这种情况下你可以添加额外的replace)和/或b)数据库中的每个人都没有昵称,你可能需要调整这个(在这种情况下,您可能希望将该部分包装在案例陈述中,最有可能)。