sql >> Databáze >  >> RDS >> Sqlserver

Top 5 faktů pro hledání a nahrazování textů SQL na serveru SQL pomocí funkce REPLACE

Dnešní editory kódu a textové procesory přicházejí s funkcí vyhledávání a nahrazování. Je to užitečné, když potřebujete změnit slovo nebo skupinu slov. Nechceme zahodit naši písemnou práci kvůli menšímu problému nebo změně.

Totéž platí pro naše data. Uživatelé nás budou proklínat, když jim řekneme, aby upravili to, co je potřeba přejmenovat. Proto je k dispozici také funkce vyhledávání a nahrazování, která nahrazuje texty zapsané v našich databázích. Zde přichází na řadu příkaz REPLACE v SQL.

Syntaxe REPLACE v SQL je následující:

NAHRADIT ( , , )

Všimněte si, že všechny parametry jsou povinné. může být řetězcový literál nebo řetězcový výsledek výrazu. V databázových tabulkách obvykle předáváme sloupec řetězce, kde chceme, aby se hodnota změnila. Mezitím je řetězec v rámci chcete hledat. Nakonec předáte který nahradí . Jednoduché, dost, ne?

Ale mohou existovat určité výhrady. Tímto způsobem můžete zjistit, jak se vyhnout nahrazení nesprávných slov nebo jak se vyhnout vkládání duplicitních záznamů na SQL Server. Nebo možná nenahrazuje správná slova. Pak si na konci zkazíte data.

Jste v SQL REPLACE nováčkem? Zde je pro vás ZDARMA cheat sheet. Stačí zadat svou e-mailovou adresu níže a my vám ji zašleme přímo do vaší schránky.

Zní to dobře? Pojďme se do toho pustit.

[sendpulse-form id=”12251″]

1. SQL REPLACE Nahradí text pro VŠECHNY výskyty

To je správně. Zamete celý váš text s řetězcem, který chcete hledat. Dovolte mi, abych vám to ukázal a vysvětlil problém. Podívejte se na níže uvedený příklad:

SELECT REPLACE('know the unknown','know','seek'); 
-- OUTPUT: 'seek the unseekn. Surprise!

vědět řetězec existuje dvakrát, ve slovech vědět a ne n. Pokud si nedáte pozor, vkradou se vám do dat pravopisné chyby. Místo toho můžete přidat prostor pro vyhledávání pouze úplných slov. Zde je upravený kód:

SELECT REPLACE('know the unknown','know ','seek ');   
-- OUTPUT: 'seek the unknown'.

Mnohem lepší? Mohou existovat i jiné scénáře, ale pointu chápete.

2. SQL REPLACE může odstranit texty

Zkusili jste v textovém editoru nahradit slovo ničím? Nebo možná chcete odstranit duplikáty v SQL? Stává se to také v SQL REPLACE. Zde je příklad:

USE AdventureWorks
GO

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

První sloupec obsahuje původní název domény e-mailové adresy. Druhý odstraní pomlčku z původního názvu domény. Viz snímek obrazovky níže:

Pokud potřebujete odstranit jeden nebo více znaků z původního řetězce, použijte jako náhradu prázdný řetězec SQL. Tímto způsobem můžete také odstranit duplicitní záznamy v SQL.

3. Collation ovlivňuje výsledky SQL REPLACE

Při instalaci serveru SQL se použije výchozí řazení. To zase využijí vaše databáze a sloupce tabulek. Obrázek 2 ukazuje ten, který používám:

Na svém notebooku používám SQL_Latin1_CP1_CI_AS . Jedná se o třídění bez rozlišení velkých a malých písmen. (Viz také CI v názvu řazení pro c ase i necitlivé). Proto slova Pes , pes , PES a dOg bude zacházeno stejně.

Zkusme to v akci:

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');

A výsledek je:

Funkce REPLACE našla slovo Kočka v Kočce s v první větě a slovo kočka v poslední větě. Je irelevantní, zda jsou písmena velká nebo malá.

Pokud však v rámci REPLACE vynutíme změnu řazení na rozlišování velkých a malých písmen, co se stane? Zde je kód používající COLLATE v 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'); 

A tady je výstup:

Nyní vidíte, jak řazení ovlivňuje výsledek. Kočka a kočka se nyní zachází jinak. Odstavec se stává nepřehledným. Z toho tedy plyne ponaučení používat řazení opatrně.

4. Můžete vnořit SQL REPLACE

Slova, která jste již nahradili, můžete nahradit vnořením funkce REPLACE. Zde je příklad:

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';

Výše uvedený příklad používal REPLACE v REPLACE. To znamená změnit POSTUP VYTVOŘENÍ ZMĚNIT POSTUP pak ID_podniku na BusinessEntityNo .

Dotaz ovlivní uložené procedury, které používaly BusinessEntityID sloupec. To je užitečné, když chcete přejmenovat sloupec v tabulce a nahradit kód dotčené databáze. Parametry uložené procedury jsou také ovlivněny, ale můžete se rozhodnout je nahradit, abyste zachovali konzistenci pojmenování.

Všimněte si, že před provedením příkazů ALTER musíte zkontrolovat změny, které budou použity. Nechceš věci pokazit, že?

Mezitím může vnoření REPLACE také vyřešit problém, který jsme měli dříve u koček a psi . Zde je oprava:

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');

Podívejte se na nový výsledek:

Všimněte si také, že problém s velkými písmeny na obrázku 3 je také opraven.

5. Použijte s UPDATE k uložení nahrazených textů

Doposud jsme používali pouze SQL REPLACE s SELECT dotazem. To nám umožní vidět pouze výstup REPLACE. Chcete-li uložit jeho výstup, musíte také vydat UPDATE. Zde je příklad:

USE AdventureWorks
GO

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

Zde je další příklad použití MySQL zahrnující blog_posts tabulka ve WordPressu. Podívejte se, jak můžete nahradit soukromou adresu URL veřejnou:

-- 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';

Výslednou sadu pro první příkaz výše lze vidět níže pomocí dbForge Studio pro MySQL:

Závěr

Zatím je vše dobré. Viděli jste, co REPLACE v SQL dokáže v akci. Může poskytnout nápady, když potřebujete změnit e-mailové adresy a adresy URL. pokud přejmenujete sloupec v tabulce použité v uložené proceduře, pohledu nebo synonymu.

Udělejme si rekapitulaci:

  • SQL REPLACE může nahradit text pro VŠECHNY výskyty.
  • Může také odstranit část textu.
  • Nastavení řazení může ovlivnit výstup REPLACE.
  • Můžete vnořit použití SQL REPLACE.
  • Nakonec použijte UPDATE k uložení nahrazených textů.

Pokud se vám tento příspěvek líbí, sdílejte jej na svých oblíbených sociálních sítích. Dejte nám také vědět, co si myslíte v sekci komentářů níže.


  1. Zaměňte citlivá data ve svých prováděcích plánech

  2. PDOException SQLSTATE[HY000] [2002] Žádný takový soubor nebo adresář

  3. Jak mohu VYBRAT více sloupců v CASE WHEN na SQL Server?

  4. Jak zrušit více intervalových oddílů na základě data?