1

假设我在 tableA 中有一个列名称

Name
jennifer Hughs
Mike nadrotosky
Arnold Woods
Raj Jai Soni

那么我如何将这些结果放在单独的 3 列中,例如

FirstName MiddleName LastName
Jennifer              Hughs
.
.
.
Raj        Jai       Soni

我尝试使用 Substring 但无法正常工作。

4

2 回答 2

3

好吧,它看起来比实际上要容易得多 - 特别是如果您开始有多个名字和/或中间名的人。

我的方法是创建一个封装该逻辑的存储函数——仅仅在内联 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
于 2011-03-10T22:09:06.440 回答
0

@marc_s 答案是最完整的。有几次我不得不这样做,它们是一次性的数据加载类型的工作。如果您的相同,我强烈建议您在 Excel 中执行此操作!

  1. 将表格从 Management Studio 复制并粘贴到 Excel
  2. 使用文本到列
  3. 重新排序第 3 列的整行以获取所有没有中间名的顶部
  4. 选择所有第 3 列为空的值,并将值从第 2 列移到第 3 列
  5. 将数据导入目标 SQL 表

为了在 T-SQL 中执行此操作,我使用SQL Sharp中的字符串拆分函数完成了此操作。然而,这最终会产生与@marc_s 相似的结果,所以我不会在这里讨论。

于 2011-03-10T22:25:04.667 回答