-1

我正在尝试从员工表中获取名字,在员工表 full_name 中是这样的:Dow,Mike P。

我尝试使用以下语法获取名字,但它带有中间名首字母 - 如果有的话,如何从名字中删除中间名首字母。因为并非所有名称都包含中间初始值。

- 询问 -

select  Employee_First_Name as full_name, 
        SUBSTRING(
            Employee_First_Name, 
            CHARINDEX(',', Employee_First_Name) + 1,                
            len(Employee_First_Name)) AS FirstName 
        ---> remove middle initial from right side from employee

- 结果

Full_name Firstname Dow,Mike P. Mike P.

--Full_name 数据的几个例子---

smith,joe j. --->joe (need result as)

smith,alan ---->alan (need result as)
4

4 回答 4

0

而不是指定len您需要charindex再次使用,而是指定您希望第二次出现空格。

select  Employee_First_Name as full_name, 
        SUBSTRING(
            Employee_First_Name, 
            CHARINDEX(',', Employee_First_Name) + 1,                
            CHARINDEX(' ', Employee_First_Name, 2)) AS FirstName 

需要注意的一点是,charindex如果没有第二次出现,第二次可以返回 0。在这种情况下,您可能需要使用以下内容:

select  Employee_First_Name as full_name, 
        SUBSTRING(
            Employee_First_Name, 
            CHARINDEX(',', Employee_First_Name) + 1,                
            IIF(CHARINDEX(' ', Employee_First_Name, 2) = 0, Len(Employee_First_name), CHARINDEX(' ', Employee_First_Name, 2))) AS FirstName 
于 2015-12-09T14:42:03.047 回答
0

这将删除逗号之前的部分.. 然后使用该字符串并删除空格后的所有内容。

WITH cte AS (
    SELECT * 
    FROM (VALUES('smith,joe j.'),('smith,alan'),('joe smith')) t(fullname)
)

SELECT
    SUBSTRING(
        LTRIM(SUBSTRING(fullname,CHARINDEX(',',fullname) + 1,LEN(fullname))),
        0,
        COALESCE(NULLIF(CHARINDEX(' ',LTRIM(SUBSTRING(fullname,CHARINDEX(',',fullname) + 1,LEN(fullname)))),0),LEN(fullname)))
FROM cte

output
------
joe
alan
joe
于 2015-12-09T15:04:31.267 回答
0

老实说,这最容易用多层次的逻辑来表达。一种方法是使用outer apply

select ttt.firstname
from t outer apply
     (select substring(t.full_name, charindex(', ', t.full_name) + 2, len(t.full_name) as firstmi
     ) tt outer apply
     (select (case when tt.firstmi like '% %'
                   then left(tt.firstmi, charindex(' ', tt.firstmi)
                   else tt.firstmi
              end) as firstname
     ) as ttt

如果你想把这一切都放在一个复杂的语句中,我会建议一个计算列:

alter table t
    add firstname as (stuff((case when full_name like '%, % %.',
                                  then left(full_name, 
                                            charindex(' ', full_name, charindex(', ', full_name) + 2)
                                           )
                                  else full_name
                             end),
                            1,
                            charindex(', ', full_name) + 2,
                            '')
于 2015-12-09T15:20:06.837 回答
0

如果此 full_name 字段的格式对于所有行都是相同的,则您可以利用 SQL FTS 分词器的功能来完成此任务:

SELECT N'Dow, Mike P.' AS full_name INTO #t

SELECT display_term FROM #t
CROSS APPLY sys.dm_fts_parser(N'"' + full_name + N'"', 1033, NULL, 1) p
WHERE occurrence = 2

DROP TABLE #t
于 2015-12-09T15:32:33.490 回答