如何从Sql server表数据中获取中间部分?

时间:2015-12-09 14:36:02

标签: sql sql-server substring charindex

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

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

- 查询 -

ALTER TABLE t1 MODIFY b BIGINT NOT NULL;

- 结果

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数据的几个例子---

Full_name Firstname Dow,Mike P. Mike P.

4 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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

答案 2 :(得分: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,
                            '')

答案 3 :(得分: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