Sql server 如何从全名中提取firstname、middle和LastName
如何从下面的示例中提取firstname、middlename和lastname 格式 FirstName,LastName可选middlenameorinitial 样本数据 詹姆斯,贝弗利B 马尔斯,克拉伦斯 麦考伊,简A 弗恩,盖尔·梅 我明白了Sql server 如何从全名中提取firstname、middle和LastName,sql-server,tsql,substring,Sql Server,Tsql,Substring,如何从下面的示例中提取firstname、middlename和lastname 格式 FirstName,LastName可选middlenameorinitial 样本数据 詹姆斯,贝弗利B 马尔斯,克拉伦斯 麦考伊,简A 弗恩,盖尔·梅 我明白了 SUBSTRING((SUBSTRING(p.name, CHARINDEX(' ', p.name) + 1, 8000)), 1, CHARINDEX(' ', (SUBSTRING(p.name, CHARINDEX(' ', p.na
SUBSTRING((SUBSTRING(p.name, CHARINDEX(' ', p.name) + 1, 8000)), 1, CHARINDEX(' ', (SUBSTRING(p.name, CHARINDEX(' ', p.name) + 1, 8000))) - 1)as[PatientLastName]
case
when LEN(LTRIM(rtrim(p.name))) - LEN(replace(ltrim(rtrim(p.name)),' ','')) = 2
then REVERSE(SUBSTRING(REVERSE(LTRIM(RTRIM(p.name))),1,CHARINDEX(' ',REVERSE(LTRIM(RTRIM(p.name))))))
else ''end as[PatientMiddleName]
,Replace(LEFT(p.Name,CHARINDEX(' ',p.Name)-1),',','') as PatientFirstName
我想你会发现这很有用
create table #temp
(
FULLNAME VARCHAR(100),
ID INT
)
INSERT INTO #TEMP VALUES ('TUCKER, KEVIN G', 1)
INSERT INTO #TEMP VALUES ('SCOTT, JOHN', 2)
INSERT INTO #TEMP VALUES ('ERIC, T W', 3)
INSERT INTO #TEMP VALUES ('MUNICH, SMITH D', 4)
INSERT INTO #TEMP VALUES ('LYOD SR, CLIVE G', 5)
INSERT INTO #TEMP VALUES ('HANSEN JR, CHARLES S', 6)
INSERT INTO #TEMP VALUES ('BROWN,SHERMAN', 7)
INSERT INTO #TEMP VALUES ('ANDREWS III, CLARK A', 8)
INSERT INTO #TEMP VALUES ('MAMMTAN, MARY LOU', 9)
DECLARE @Suffixes TABLE(
Suffix VARCHAR(5)
)
INSERT INTO @Suffixes
VALUES ('I'),
('II'),
('III'),
('IV'),
('V'),
('SR'),
('JR'),
('1st'),
('2nd'),
('3rd')
SELECT T.id,
T.Fullname,
F7.*,
F4.[LAST Name],
F4.Suffix
FROM #temp T
CROSS APPLY (SELECT LEFT(T.FullName,CHARINDEX(',',T.FULLNAME + ',') - 1) AS cLastName,
LTRIM(SUBSTRING(T.FullName,CHARINDEX(',',T.FULLNAME + ',') + 1,
LEN(T.FullName))) AS cFirstName) F1
CROSS APPLY (SELECT LEFT(F1.cLastName,CHARINDEX(' ',F1.cLastName + ' ') - 1) AS LName,
SUBSTRING(F1.cLastName,CHARINDEX(' ',F1.cLastName + ' ') + 1,
LEN(F1.cLastName)) AS pSuffix) F2
CROSS APPLY (SELECT CASE
WHEN LEN(pSuffix) > 0
AND EXISTS (SELECT 1
FROM @Suffixes S
WHERE S.Suffix = pSuffix) THEN 'Y'
ELSE 'N'
END AS SuffixExists) F3
CROSS APPLY (SELECT CASE
WHEN F3.SuffixExists = 'Y' THEN F2.LName
ELSE RTRIM(F2.LName + ' ' + F2.pSuffix)
END AS [LAST Name],
CASE
WHEN F3.SuffixExists = 'Y' THEN F2.pSuffix
ELSE ''
END AS [Suffix]) F4
CROSS APPLY (SELECT LEFT(F1.cFirstName,CHARINDEX(' ',F1.cFirstName + ' ') - 1) AS FName,
SUBSTRING(F1.cFirstName,CHARINDEX(' ',F1.cFirstName + ' ') + 1,
LEN(F1.cFirstName)) AS MInitial) F5
CROSS APPLY (SELECT CASE
WHEN LEN(MInitial) = 1 THEN 'Y'
ELSE 'N'
END AS MIExists) F6
CROSS APPLY (SELECT CASE
WHEN F6.MIExists = 'Y' THEN F5.FName
ELSE RTRIM(F5.FName + ' ' + F5.MInitial)
END AS [FIRST Name],
CASE
WHEN F6.MIExists = 'Y' THEN F5.MInitial
ELSE ''
END AS [Middle Initial]) F7
在火星上,克拉伦斯·麦考伊,简A,哪一个是名字,中间名和姓氏?另外,我有两个中间名。除非明确要求,否则我从不提及它们,部分原因是为了防止这样的数据集出现问题。总有一天我们会有名字的。有一天…Jane是名字,Mccoy是姓氏,A是中间名多个中间名或名称部分实际上非常常见,特别是在其他语言中,如荷兰语。这就是为什么这种类型的东西如此有问题的另一个例子。至少有一行没有逗号,charindex为-1。
create table #temp
(
FULLNAME VARCHAR(100),
ID INT
)
INSERT INTO #TEMP VALUES ('TUCKER, KEVIN G', 1)
INSERT INTO #TEMP VALUES ('SCOTT, JOHN', 2)
INSERT INTO #TEMP VALUES ('ERIC, T W', 3)
INSERT INTO #TEMP VALUES ('MUNICH, SMITH D', 4)
INSERT INTO #TEMP VALUES ('LYOD SR, CLIVE G', 5)
INSERT INTO #TEMP VALUES ('HANSEN JR, CHARLES S', 6)
INSERT INTO #TEMP VALUES ('BROWN,SHERMAN', 7)
INSERT INTO #TEMP VALUES ('ANDREWS III, CLARK A', 8)
INSERT INTO #TEMP VALUES ('MAMMTAN, MARY LOU', 9)
DECLARE @Suffixes TABLE(
Suffix VARCHAR(5)
)
INSERT INTO @Suffixes
VALUES ('I'),
('II'),
('III'),
('IV'),
('V'),
('SR'),
('JR'),
('1st'),
('2nd'),
('3rd')
SELECT T.id,
T.Fullname,
F7.*,
F4.[LAST Name],
F4.Suffix
FROM #temp T
CROSS APPLY (SELECT LEFT(T.FullName,CHARINDEX(',',T.FULLNAME + ',') - 1) AS cLastName,
LTRIM(SUBSTRING(T.FullName,CHARINDEX(',',T.FULLNAME + ',') + 1,
LEN(T.FullName))) AS cFirstName) F1
CROSS APPLY (SELECT LEFT(F1.cLastName,CHARINDEX(' ',F1.cLastName + ' ') - 1) AS LName,
SUBSTRING(F1.cLastName,CHARINDEX(' ',F1.cLastName + ' ') + 1,
LEN(F1.cLastName)) AS pSuffix) F2
CROSS APPLY (SELECT CASE
WHEN LEN(pSuffix) > 0
AND EXISTS (SELECT 1
FROM @Suffixes S
WHERE S.Suffix = pSuffix) THEN 'Y'
ELSE 'N'
END AS SuffixExists) F3
CROSS APPLY (SELECT CASE
WHEN F3.SuffixExists = 'Y' THEN F2.LName
ELSE RTRIM(F2.LName + ' ' + F2.pSuffix)
END AS [LAST Name],
CASE
WHEN F3.SuffixExists = 'Y' THEN F2.pSuffix
ELSE ''
END AS [Suffix]) F4
CROSS APPLY (SELECT LEFT(F1.cFirstName,CHARINDEX(' ',F1.cFirstName + ' ') - 1) AS FName,
SUBSTRING(F1.cFirstName,CHARINDEX(' ',F1.cFirstName + ' ') + 1,
LEN(F1.cFirstName)) AS MInitial) F5
CROSS APPLY (SELECT CASE
WHEN LEN(MInitial) = 1 THEN 'Y'
ELSE 'N'
END AS MIExists) F6
CROSS APPLY (SELECT CASE
WHEN F6.MIExists = 'Y' THEN F5.FName
ELSE RTRIM(F5.FName + ' ' + F5.MInitial)
END AS [FIRST Name],
CASE
WHEN F6.MIExists = 'Y' THEN F5.MInitial
ELSE ''
END AS [Middle Initial]) F7