sql >> Databasteknik >  >> RDS >> Sqlserver

Topp 5 fakta för att hitta och ersätta SQL-texter i SQL Server med REPLACE-funktionen

Dagens kodredigerare och ordbehandlare kommer med en sök- och ersätt-funktion. Det är användbart när du behöver ändra ett ord eller en grupp av ord. Vi vill inte kasta bort vårt skrivna arbete för ett mindre problem eller förändring.

Samma sak gäller för vår data. Användare kommer att förbanna oss om vi säger åt dem att redigera det som behöver bytas namn. Det är därför en sök- och ersätt-funktion också är tillgänglig för att ersätta texter skrivna i våra databaser. Här kommer kommandot REPLACE i SQL in.

Syntaxen REPLACE i SQL är följande:

ERSÄTT ( , , )

Observera att alla parametrar krävs. kan vara en bokstavlig sträng eller ett strängresultat av ett uttryck. I databastabeller skickar vi vanligtvis en strängkolumn där vi vill att värdet ska ändras. Under tiden är en sträng inom du vill söka. Slutligen skickar du en som kommer att ersätta . Enkelt, nog, eller hur?

Men det kan finnas några varningar. På så sätt kan du ta reda på hur du undviker att ersätta fel ord eller hur du undviker att infoga dubbletter av poster i SQL Server. Eller kanske inte ersätta de rätta orden. Då förstör du din data till slut.

Är du ny på SQL REPLACE? Här är ett GRATIS fuskblad för dig. Ange bara din e-postadress nedan så skickar vi den direkt till din inkorg.

Låter coolt? Låt oss gräva i.

[sendpulse-form id="12251″]

1. SQL REPLACE ersätter text för ALLA förekomster

Det är rätt. Den sveper hela din text med strängen du vill söka efter. Låt mig visa det för dig och förklara problemet. Ta en titt på exemplet nedan:

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

vet strängen finns två gånger, med orden vet och ovet n. Om du inte är försiktig kommer stavfel krypa in i din data. Istället kan du lägga till utrymme för att endast söka efter fullständiga ord. Här är den ändrade koden:

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

Mycket bättre? Det kan finnas andra scenarier, men du förstår poängen.

2. SQL REPLACE kan ta bort texter

Har du testat att ersätta ett ord med ingenting i en textredigerare? Eller vill du kanske ta bort dubbletter i SQL? Det händer också i SQL REPLACE. Här är ett exempel:

USE AdventureWorks
GO

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

Den första kolumnen innehåller det ursprungliga domännamnet för e-postadressen. Den andra tar bort bindestrecket från det ursprungliga domännamnet. Se skärmdumpen nedan:

Om du behöver ta bort ett eller flera tecken från den ursprungliga strängen, använd en tom SQL-sträng som ersättning. Du kan också ta bort dubbletter i SQL på detta sätt.

3. Sortering påverkar resultaten av SQL REPLACE

När du installerar en SQL Server används en standardsortering. Detta kommer i sin tur att användas av dina databaser och tabellkolumner. Figur 2 visar den jag använder:

På min bärbara dator använder jag SQL_Latin1_CP1_CI_AS . Det är en skiftlägesokänslig sammanställning. (Se även CI i sorteringsnamnet för c ase i okänslig). Därav orden Hund , hund , HUND och dOg kommer att behandlas på samma sätt.

Låt oss prova det i handling:

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

Och resultatet är:

Funktionen ERSÄTT hittade ordet Katt i Cat s i den första meningen och ordet katt i sista meningen. Det är irrelevant om bokstäverna är stora eller små bokstäver.

Men om vi tvingar fram en ändring av sammanställningen till en skiftlägeskänslig inom REPLACE, vad kommer att hända? Här är koden som använder COLLATE inom 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'); 

Och här är resultatet:

Du ser nu hur sortering påverkar resultatet. Katt och katt nu behandlas annorlunda. Paragrafen blir förvirrande. Så, lärdomen är att använda sortering med försiktighet.

4. Du kan Nest SQL REPLACE

Du kan ersätta orden du redan har ersatt genom att kapsla REPLACE-funktionen. Här är ett exempel:

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

I exemplet ovan användes en REPLACE inom en REPLACE. Det är att ändra SKAPA PROCEDUR till ÄNDRA PROCEDUR sedan BusinessEntityID till BusinessEntityNo .

Frågan kommer att påverka lagrade procedurer som använde BusinessEntityID kolumn. Detta är användbart när du vill byta namn på en kolumn i en tabell och ersätta den berörda databaskoden. Lagrade procedurparametrar påverkas också, men du kan välja att ersätta dem för att bevara namngivningskonsistensen.

Observera att innan du kör ALTER-satserna måste du kontrollera ändringarna som kommer att tillämpas. Du vill inte förstöra saker, eller hur?

Samtidigt kan häckande REPLACE också lösa problemet vi har tidigare på katter och hundar . Här är korrigeringen:

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

Kolla in det nya resultatet:

Lägg också märke till att problemet med versaler i figur 3 är fixat också.

5. Använd med UPDATE för att lagra ersatta texter

Hittills har vi bara använt SQL REPLACE med en SELECT-fråga. Detta kommer bara att tillåta oss att se resultatet av REPLACE. För att lagra dess utdata måste du också utfärda en UPPDATERING. Här är ett exempel:

USE AdventureWorks
GO

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

Här är ett annat exempel med MySQL som involverar blog_posts tabell i WordPress. Se hur du kan ersätta en privat URL med en offentlig:

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

Resultatuppsättningen för det första uttalandet ovan kan ses nedan med dbForge Studio för MySQL:

Slutsats

Än så länge är allt bra. Du såg vad REPLACE i SQL kan göra i praktiken. Det kan ge idéer när du behöver ändra e-postadresser och webbadresser. om du byter namn på en kolumn i en tabell som används i en lagrad procedur, vy eller synonym.

Låt oss ha en sammanfattning:

  • SQL REPLACE kan ersätta text för ALLA förekomster.
  • Den kan också ta bort en del av texten.
  • Sorteringsinställningar kan påverka utdata från REPLACE.
  • Du kan kapsla användningen av SQL REPLACE.
  • Använd slutligen UPDATE för att lagra de ersatta texterna.

Om du gillar det här inlägget, vänligen dela det på dina favorit sociala medier. Låt oss också veta vad du tycker i kommentarsfältet nedan.


  1. Det vanliga MySQL-felet:"Fick ett fel när kommunikationspaketet lästes"

  2. Det går inte att öppna databastest som begärts av inloggningen. Inloggningen misslyckades. Inloggning misslyckades för användaren 'xyz\ASPNET'

  3. Är det möjligt att använda SqlGeography med Linq till Sql?

  4. Hur man släpper en främmande nyckel i SQLite