我有两个表,#customer 和 #abbr。#customer 表由两列组成:“id”和“name”,而 #abbr 表包含缩写词及其相应的完整形式的条目。我的目标是将客户名称中的所有缩写替换为其各自的完整形式。例如,如果客户名称是“Object ME CT”,我希望结果是“Object Medical Control”。但是,根据我当前的查询,它会生成两行:“对象 ME 控制”和“对象医疗 CT”。我的目标是每个“id”占一行,其中所有缩写都替换为 #abbr 表中的完整形式。我怎样才能实现这个目标?谢谢你!
create table #customer
(
id int identity(1,1)
,cname varchar(100)
)
create table #abbr
(
abbr varchar(100),
fname varchar(100)
)
insert into #customer values('Assign ME CT'),('Assign ME'),('Assign CT')
insert into #abbr values ('ME','Medical'),('CT','Control'),('MMT','Metro')
select *, REPLACE(c.cname, a.abbr,a.fname)
from #customer c
join #abbr a
on c.cname like '%'+a.abbr+'%'
where id = 1
从 SQL 2022 开始,执行此操作的一种方法是拆分每个客户行中的值,替换它们,然后再次将它们压缩回来。在 STRING_SPLIT() 函数中将enable_ordinal 标志设置为 1 可提供每个字符串中子字符串的顺序,并在此序数列周围使用WITHIN GROUP 子句可确保它们按照分解的方式压缩回来。做到这一点的代码是这样的 -
产生这个 -
或者,如果在早期版本的 SQL 上,您可以编写自定义函数来提供序数列。这样的函数可能看起来像这样 -
在代码中使用此函数来产生所需的结果将是 -
我调整了 Caleb 提供的查询,以确保我们始终按照拆分的顺序缝合短语,为了做到这一点,我使用了 Aaron 在一篇文章中建议的 OPENJSON 拆分技巧。这对我有用。