如何使用sql将列拆分为多个值

时间:2014-01-31 17:00:28

标签: sql sql-server

如果我有数千行数据,我想知道列是否为“Last” 名称“包含名字和姓氏(也可能是中间名称)。什么SQL命令 我用吗? (SQL Server 2008)。找到后,如何拆分姓氏字段和位置 他们自己的专栏中的名字或中间名?

例如:

First Name        MI       Last Name

John              B.       Smith  
                           Karen A. Jones
Jane                       Lawrence
                           Joan K. Bates

是否可以在Excel中完成?

2 个答案:

答案 0 :(得分:0)

您可以在姓氏中查找空格:

select *
from t
where lastname like '% %';

您可以查找缺少名字的行:

select *
from t
where firstname is null or firstname = '';

编辑:

如果我们假设名称是样本数据中给出的“简单”,您可以这样做:

update t
    set firstname = left(lastname, charindex(' ', lastname) - 1),
        lastname = right(lastname, charindex(' ', reverse(lastname))),
        mi = (case when lastname like '% % %'
                   then rtrim(ltrim(substring(lastname, charindex(' ', lastname + 1), 2)))
              end)
    where lastname like '% %' and firstname is null;

这对格式做了很多假设。 。 。没有完整的中间名,没有荣誉,没有后缀,没有多个空格在一起。但是,如果您的数据很简单,它应该可以正常工作。

Here是SQL Fiddle中逻辑的一个例子。

答案 1 :(得分:0)

我会两次通过:

-- Set first name
UPDATE names
SET FirstName = SUBSTR(LastName,1,CHARINDEX(' ',LastName) - 1),
    LastName = SUBSTR(LastName,CHARINDEX(' ',LastName) + 1, LEN(LastName))
WHERE FirstNAme IS NULL
    AND CHARINDEX(' ',LastName) > 0

-- Set middle name
UPDATE names
SET MI = SUBSTR(LastName,1,CHARINDEX(' ',LastName) - 1),
    LastName = SUBSTR(LastName,CHARINDEX(' ',LastName) + 1, LEN(LastName))
WHERE MI IS NULL
    AND CHARINDEX(' ',LastName) > 0

你可能会有一些误报,但这应该是绝大多数情况。

我强烈建议创建一个事务,进行更新,执行SELECT查看结果并回滚事务,因为更新不可逆。