Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Os 5 principais fatos para localizar e substituir textos SQL no SQL Server com a função REPLACE


Os editores de código e processadores de texto de hoje vêm com um recurso de pesquisa e substituição. É útil quando você precisa alterar uma palavra ou um grupo de palavras. Não queremos jogar fora nosso trabalho escrito por um pequeno problema ou mudança.

A mesma coisa se aplica aos nossos dados. Os usuários vão nos xingar se dissermos para eles editarem o que precisa ser renomeado. É por isso que um recurso de pesquisa e substituição também está disponível para substituir textos escritos em nossos bancos de dados. Aqui entra o comando REPLACE no SQL.

A sintaxe REPLACE no SQL é a seguinte:

TROCAR ( , , )

Observe que todos os parâmetros são obrigatórios. A pode ser um literal de string ou um resultado de string de uma expressão. Em tabelas de banco de dados, geralmente passamos uma coluna de string onde queremos que o valor mude. Enquanto isso, é uma string dentro de você deseja pesquisar. Por fim, você passa uma que substituirá . Simples, bastante, não é?

Mas pode haver algumas ressalvas. Dessa forma, você pode descobrir como evitar a substituição de palavras erradas ou como evitar a inserção de registros duplicados no SQL Server. Ou, talvez, não substituindo as palavras certas. Em seguida, bagunçando seus dados no final.

Você é novo no SQL REPLACE? Aqui está uma folha de dicas GRATUITA para você. Basta digitar seu endereço de e-mail abaixo e enviaremos diretamente para sua caixa de entrada.

Parece legal? Vamos cavar.

[id do formulário de envio=”12251″]

1. SQL REPLACE substitui o texto para TODAS as ocorrências


Está certo. Ele varre todo o seu texto com a string que você deseja pesquisar. Deixe-me mostrar a você e explicar o problema. Dê uma olhada no exemplo abaixo:
SELECT REPLACE('know the unknown','know','seek'); 
-- OUTPUT: 'seek the unseekn. Surprise!

O sabe string existe duas vezes, nas palavras saber e nãosabe n. Se você não for cuidadoso, erros de ortografia se infiltrarão em seus dados. Em vez disso, você pode adicionar espaço para pesquisar apenas palavras completas. Segue o código modificado:
SELECT REPLACE('know the unknown','know ','seek ');   
-- OUTPUT: 'seek the unknown'.

Muito melhor? Pode haver outros cenários, mas você entendeu.

2. SQL REPLACE pode remover textos


Você já tentou substituir uma palavra por nada em um editor de texto? Ou talvez você queira remover duplicatas no SQL? Isso também acontece no SQL REPLACE. Aqui está um exemplo:
USE AdventureWorks
GO

SELECT
 EmailAddress
,REPLACE(EmailAddress,'-','') AS NewEmailAddress
FROM person.EmailAddress;

A primeira coluna contém o nome de domínio do endereço de e-mail original. O segundo remove o hífen do nome de domínio original. Veja a imagem abaixo:

Se você precisar remover um ou mais caracteres da string original, use uma string SQL vazia como substituição. Você também pode excluir registros duplicados no SQL dessa maneira.

3. O agrupamento afeta os resultados do SQL REPLACE


Quando você instala um SQL Server, um agrupamento padrão é usado. Por sua vez, isso será usado por seus bancos de dados e colunas de tabela. A Figura 2 mostra o que eu uso:

No meu laptop, uso SQL_Latin1_CP1_CI_AS . É um agrupamento que não diferencia maiúsculas de minúsculas. (Veja também CI no nome do agrupamento para c asse eu sensível). Assim, as palavras Cão , cão , CÃO , e cão será tratado da mesma forma.

Vamos tentar em ação:
DECLARE @string VARCHAR(200) = 'Cats are great pets 
and so easy to take care of. They make good companions. 
Having a cat around is good for children.';

SELECT REPLACE(@string,'cat','dog');

E o resultado é:

O recurso SUBSTITUIR encontrou a palavra Gato em Gato s na primeira frase e a palavra gato na última frase. É irrelevante se as letras são maiúsculas ou minúsculas.

No entanto, se forçarmos uma mudança na ordenação para uma diferenciação de maiúsculas e minúsculas em REPLACE, o que acontecerá? Aqui está o código usando COLLATE dentro de REPLACE:
DECLARE @string VARCHAR(200) = 'Cats are great pets and so easy to take care of.
They make good companions. Having a cat around is good for children.';

-- force a change to a case-sensitive collation. '_CS_' for case-sensitive
SELECT REPLACE(@string COLLATE SQL_Latin1_General_CP1_CS_AS,'cat','dog'); 

E aqui está a saída:

Agora você vê como o agrupamento afeta o resultado. Gato e gato agora são tratados de forma diferente. O parágrafo fica confuso. Portanto, a lição é usar o agrupamento com cautela.

4. Você pode aninhar SQL REPLACE


Você pode substituir as palavras que já substituiu aninhando a função REPLACE. Aqui está um exemplo:
USE AdventureWorks
GO

SELECT 
 definition
,REPLACE(REPLACE(definition,'CREATE PROCEDURE','ALTER PROCEDURE'),'BusinessEntityID','BusinessEntityNo')
FROM sys.sql_modules a
INNER JOIN sys.objects b ON a.object_id = b.object_id
WHERE a.definition LIKE '%BusinessEntityID%'
AND b.type = 'P';

O exemplo acima usou um REPLACE dentro de um REPLACE. Isso é para alterar CREATE PROCEDURE para ALTER O PROCEDIMENTO então BusinessEntityID para BusinessEntityNo .

A consulta afetará os procedimentos armazenados que usaram o BusinessEntityID coluna. Isso é útil quando você deseja renomear uma coluna em uma tabela e substituir o código do banco de dados afetado. Os parâmetros do procedimento armazenado também são afetados, mas você pode optar por substituí-los para preservar a consistência da nomenclatura.

Observe que antes de executar as instruções ALTER você precisa verificar as alterações que serão aplicadas. Você não quer estragar as coisas, quer?

Enquanto isso, aninhar REPLACE também pode corrigir o problema que tivemos anteriormente em gatos e cães . Aqui está a correção:
DECLARE @string VARCHAR(200) = 'Cats are great pets and so easy to take care of.
They make good companions. Having a cat around is good for children.';

SELECT REPLACE(REPLACE(@string COLLATE SQL_Latin1_General_CP1_CS_AS,'cat','dog') COLLATE SQL_Latin1_General_CP1_CS_AS,'Cat','Dog');

Confira o novo resultado:

Observe também que o problema de capitalização na Figura 3 também foi corrigido.

5. Use com UPDATE para armazenar textos substituídos


Até agora, usamos apenas SQL REPLACE com uma consulta SELECT. Isso só nos permitirá ver a saída de REPLACE. Para armazenar sua saída, você também precisa emitir um UPDATE. Aqui está um exemplo:
USE AdventureWorks
GO

UPDATE Person.EmailAddress
 SET EmailAddress= REPLACE(EmailAddress,'-','');

Aqui está outro exemplo usando MySQL envolvendo o blog_posts tabela no WordPress. Veja como você pode substituir uma URL privada por uma pública:
-- View the possible results
SELECT 
 guid 
,REPLACE(guid,'http://localhost/techblog','https://sqltechblog.net') AS NewGUID
FROM blog_posts
WHERE post_date > '2020-10-01';

-- Update the blog_posts table by replacing localhost with a fictitious URL
UPDATE blog_posts
set guid = REPLACE(guid,'http://localhost/techblog','https://sqltechblog.net')
WHERE post_date > '2020-10-01';

O conjunto de resultados para a primeira instrução acima pode ser visto abaixo usando o dbForge Studio for MySQL:

Conclusão


Até agora tudo bem. Você viu o que REPLACE no SQL pode fazer em ação. Ele pode dar ideias quando você precisar alterar endereços de e-mail e URLs. se você renomear uma coluna em uma tabela usada em um procedimento armazenado, exibição ou sinônimo.

Vamos recapitular:
  • SQL REPLACE pode substituir texto em TODAS as ocorrências.
  • Também pode remover uma parte do texto.
  • As configurações de agrupamento podem afetar a saída de REPLACE.
  • Você pode aninhar o uso de SQL REPLACE.
  • Por fim, use UPDATE para armazenar os textos substituídos.

Se você gostou deste post, compartilhe-o em suas redes sociais favoritas. Deixe-nos também saber o que você pensa na seção de comentários abaixo.