在sql server中使用parsename函数处理字符串连接

时间:2011-11-25 19:43:10

标签: sql-server

我有一张员工表,其中的示例数据是这样的。我正在使用sql server 2008。

CREATE TABLE employee (name nvarchar(255))

insert into employee (name) values ('Alex,AlexMartin'),
                            ('John,John'),
                            ('Mayr,Mayr'),
                            ('Shel,Sheila'),
                            ('corolla,corolla,corolla3'),
                            ('Mary4,Mary,Mary'),
                            ('Justin,Justin,Justin'),
                            ('Sara,Sara,Sara,Sara'),
                            ('clarence,clarence,clarence458,clarence,clarence'),
                            ('fiesta,fiesta,fiesta,fiesta,fiesta'),
                            ('scorpio1,scorpio,scorpio,scorpio4,scorpio')

如果字符串中的所有值都是相同的示例,我想删除一个值:John,John应该替换为'John'。如果字符串中的所有名称与Shel,Sheila不相等,则应保留这两个值。 为此,我正在使用 update employee set name=(select PARSENAME(REPLACE(name, ',', '.'), 2)) where (select PARSENAME(REPLACE(name, ',', '.'), 2)) like (select PARSENAME(REPLACE(name, ',', '.'), 1))但它正在将Mary4,Mary,Mary更改为Mary。我尝试了5个,4个和3个名字的组合,但是没有用。事实上,对于五个名称,这段代码根本不起作用。有没有有效的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

这将以您正在寻找的格式获取数据:

CREATE TABLE #Employee (Name NVarChar(255));
INSERT INTO #Employee (Name) VALUES ('Alex,AlexMartin'),
                            ('John,John'),
                            ('Mayr,Mayr'),
                            ('Shel,Sheila'),
                            ('corolla,corolla,corolla3'),
                            ('Mary4,Mary,Mary'),
                            ('Justin,Justin,Justin'),
                            ('Sara,Sara,Sara,Sara'),
                            ('clarence,clarence,clarence458,clarence,clarence'),
                            ('fiesta,fiesta,fiesta,fiesta,fiesta'),
                            ('scorpio1,scorpio,scorpio,scorpio4,scorpio'),
                            ('Another');

SELECT Name, CASE
 WHEN CHARINDEX(Name, ',') = 0 THEN Name
 WHEN
  REPLACE(REPLACE(Name, LEFT(Name, CHARINDEX(',', Name) - 1), ''), ',', '') = ''
    THEN LEFT(Name, CHARINDEX(',', Name) - 1)
  ELSE Name
 END Result
FROM #Employee;

DROP TABLE #Employee;

它的工作原理是在逗号分隔列表中获取名字。根据您的要求,所有项目必须相同才能压缩列表,因此列表中我们用于比较的哪个元素无关紧要。

从列表中删除所有第一个项目。然后删除所有逗号。如果结果值为空(即''),那么我们知道所有项目都是相同的。在这种情况下,第一个元素用作Result值。否则,我们将原始列表保持不变。

编辑:您的部分数据中不得包含,,因此我已更新答案以解决此问题。如果分隔符不存在,它将返回相同的输入。