Tenho duas tabelas, #customer e #abbr. A tabela #customer consiste em duas colunas: 'id' e 'name', enquanto a tabela #abbr inclui entradas para abreviações e seus correspondentes formulários completos. Meu objetivo é substituir todas as abreviações nos nomes dos clientes pelos respectivos formulários completos. Por exemplo, se o nome de um cliente for 'Object ME CT', espero que o resultado seja 'Object Medical Control'. No entanto, com minha consulta atual, ela produz duas linhas: 'Object ME Control' e 'Object Medical CT'. Meu objetivo é uma única linha por 'id', onde todas as abreviações sejam substituídas por seus formulários completos da tabela #abbr. Como posso conseguir isso? Obrigado!
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
Uma maneira de fazer isso a partir do SQL 2022 é dividir os valores em cada linha do cliente, substituí-los e compactá-los novamente. Definir o sinalizador enable_ordinal como 1 na função STRING_SPLIT() fornece a ordem das substrings em cada string, e usar a cláusula WITHIN GROUP em torno desta coluna ordinal garante que elas sejam compactadas novamente da mesma forma que são divididas. O código para fazer isso seria este -
Produz isso -
Alternativamente , se estiver em uma versão anterior do SQL, você pode escrever uma função personalizada para fornecer a coluna ordinal. Essa função pode ser assim -
E usar esta função no código para produzir o resultado desejado seria -
Ajustei a consulta fornecida por Caleb para garantir que sempre costuramos a frase na ordem em que foi dividida e, para fazer isso, estou usando o truque de divisão OPENJSON sugerido por Aaron em um artigo. Isso funcionou para mim.