SQL:使用从选择的SQL中提取的值联接表

时间:2019-04-01 11:52:24

标签: sql sql-server-2012

我有一个包含用户全名的表,例如:

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)

'='...错误

2 个答案:

答案 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;