我正在尝试从员工表中获取名字,在员工表中,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.
答案 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