假设我在 tableA 中有一个列名称
Name
jennifer Hughs
Mike nadrotosky
Arnold Woods
Raj Jai Soni
那么我如何将这些结果放在单独的 3 列中,例如
FirstName MiddleName LastName
Jennifer Hughs
.
.
.
Raj Jai Soni
我尝试使用 Substring 但无法正常工作。
假设我在 tableA 中有一个列名称
Name
jennifer Hughs
Mike nadrotosky
Arnold Woods
Raj Jai Soni
那么我如何将这些结果放在单独的 3 列中,例如
FirstName MiddleName LastName
Jennifer Hughs
.
.
.
Raj Jai Soni
我尝试使用 Substring 但无法正常工作。
好吧,它看起来比实际上要容易得多 - 特别是如果您开始有多个名字和/或中间名的人。
我的方法是创建一个封装该逻辑的存储函数——仅仅在内联 T-SQL 语句中将其拼写出来并不是那么简单。
这是第一次尝试 - 只要您没有多个中间名,就可以使用:
CREATE FUNCTION dbo.SplitName(@InputName VARCHAR(200))
RETURNS @nameParts TABLE
(
FirstName VARCHAR(100),
MiddleName VARCHAR(100),
LastName VARCHAR(100)
)
AS BEGIN
DECLARE @FirstSpace INT, @LastSpace INT
SET @FirstSpace = CHARINDEX(' ', @InputName)
SET @LastSpace = CHARINDEX(' ', @InputName, @FirstSpace+1)
INSERT INTO @nameParts(FirstName, MiddleName, LastName)
SELECT
SUBSTRING(@InputName, 1, @FirstSpace),
CASE @LastSpace
WHEN 0 THEN CAST(NULL AS VARCHAR(100))
ELSE SUBSTRING(@InputName, @FirstSpace+1, @LastSpace - @FirstSpace)
END,
CASE @LastSpace
WHEN 0 THEN SUBSTRING(@InputName, @FirstSpace+1, 999)
ELSE SUBSTRING(@InputName, @LastSpace, 999)
END
RETURN
END
如果您使用一些示例数据对此进行测试,您将获得以下结果:
DECLARE @nameTable TABLE (NameValue VARCHAR(100))
INSERT INTO @nametable VALUES('Jennifer Hughes')
INSERT INTO @nametable VALUES('Mike Nadrotosky')
INSERT INTO @nametable VALUES('Arnold Woods')
INSERT INTO @nametable VALUES('Raj Jai Soni')
SELECT *
FROM @nameTable
CROSS APPLY dbo.SplitName(nameValue)
该 SELECT 的输出是:
NameValue FirstName MiddleName LastName
Jennifer Hughes Jennifer NULL Hughes
Mike Nadrotosky Mike NULL Nadrotosky
Arnold Woods Arnold NULL Woods
Raj Jai Soni Raj Jai Soni
@marc_s 答案是最完整的。有几次我不得不这样做,它们是一次性的数据加载类型的工作。如果您的相同,我强烈建议您在 Excel 中执行此操作!
为了在 T-SQL 中执行此操作,我使用SQL Sharp中的字符串拆分函数完成了此操作。然而,这最终会产生与@marc_s 相似的结果,所以我不会在这里讨论。