我有一张员工表,其中的示例数据是这样的。我正在使用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个名字的组合,但是没有用。事实上,对于五个名称,这段代码根本不起作用。有没有有效的方法来做到这一点?
答案 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
值。否则,我们将原始列表保持不变。
编辑:您的部分数据中不得包含,
,因此我已更新答案以解决此问题。如果分隔符不存在,它将返回相同的输入。