我有一个包含用户全名的表,例如:
Blagg, Eli D.
Do, Danny
Foley, Charles E. Jr
.....
使用此SQL仅给我提供名字和姓氏中的值。
select concat(vl.lastname, vf.firstname)
from UserName as t cross apply
(values (left(t.name, charindex(', ', t.name)), stuff(t.name, 1,
charindex(', ', t.name) + 1, ''))) vl(lastname, rest)
cross apply
(values (left(vl.rest, charindex(' ', vl.rest + ' ')))) vf(firstname)
我可以使用这些值与另一个表联接,例如:
select b.name, a.LName, a.FName, a.MI
from NewRecruit a
left join UserName b on (b.name =(
select concat(vl.lastname, vf.firstname)
from contact1379 as t cross apply
(values (left(t.name, charindex(', ', t.name)), stuff(t.name, 1,
charindex(', ', t.name) + 1, ''))) vl(lastname, rest) cross apply
(values (left(vl.rest, charindex(' ', vl.rest + ' ')))) vf(firstname)
)
)
=
(a.LName + ',' + a.FName)
'='...错误
答案 0 :(得分:1)
这种字符串处理在SQL Server中很痛苦。我发现多次使用apply
会有所帮助:
select concat(vl.lastname, vf.firstname)
from (values ('Foley, Charles E. Jr'),
('Blagg, Eli D.'),
('Do, Danny')
) v(name) cross apply
(values (left(name, charindex(', ', name)), stuff(name, 1, charindex(', ', name) + 1, ''))) vl(lastname, rest) cross apply
(values (left(rest, charindex(' ', rest + ' ')))) vf(firstname);
Here是db <>小提琴。
不幸的是,string_split()
不适合,因为它不返回子字符串的顺序。其他split()
函数有时也具有此功能,希望将来会出现。
编辑:
您可以使用以下方法更新表中的值:
update t
set name = concat(vl.lastname, vf.firstname)
from t cross apply
(values (left(t.name, charindex(', ', t.name)), stuff(t.name, 1, charindex(', ', t.name) + 1, ''))) vl(lastname, rest) cross apply
(values (left(vl.rest, charindex(' ', vl.rest + ' ')))) vf(firstname);
我建议您在运行更新之前测试逻辑或备份表。
答案 1 :(得分:0)
这里是使用正则表达式检索名字和姓氏的查询。
SELECT full, REGEXP_REPLACE(full, '([a-zA-Z]+)([a-zA-Z,]+)([-\'\\s][a-zA-Z]+)','FIRST:\\1 LAST:\\3') FROM names;
FROM names;