sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan laver man en indlejret erstatning af værdier fra en anden tabel?

Ansvarsfraskrivelse:Funktion slanket som lovet, vil opdatere svarbeskrivelsen i overensstemmelse hermed i god tid.

I henhold til min nuværende forståelse af dit problem, tror jeg, at jeg kan anvende en funktion på det, jeg har designet til at løse et mere komplekst problem, jeg havde for nylig. Der kan være andre løsninger, men helt sikkert andre kan og vil foreslå dem, så hvorfor tilbyder jeg dig ikke noget, der er lidt mindre at tilbyde.

Vær dog opmærksom på, at det var meningen, at det skulle løse noget mere komplekst end dit (forklaret senere ), og lige nu Jeg har desværre ikke tid til at slanke det, men det skal jeg nok komme til i morgen. Jeg håber, at kommentarerne hjælper. Uanset hvad, vil jeg opsummere min funktions mål for dig:

Der er en tabel, der indeholder, hvilke meddelelser der skal findes, og hvad de skal erstattes med. Funktionen vil modtage en tekstværdi som input, vil bruge en markør til at sløjfe nævnte tabel, og for hver post i nævnte tabel vil den kontrollere, om inputtekst indeholder noget, der skal erstattes, og erstatte, hvis det er relevant.

To ting at bemærke om det oprindelige mål. For det første der er en indlejret løkke til at løse scenariet, hvor et bestemt søgeord eksisterer flere gange, og derfor kræver flere udskiftninger. For det andet, Jeg skulle også forholde mig til jokertegn, variable længder, og hvorvidt erstatningsflaget er sat i den diskuterede tabel. Disse to ting plus andre er sandsynligvis grunden til, at du vil finde masser af mærkeligt materiale, der flyver rundt.

CREATE FUNCTION [JACKINABOX](@TextToUpdate varchar(30), @FilterId int)
RETURNS varchar(30) AS
BEGIN

    DECLARE @Keyword varchar(30)

    DECLARE LonelyCursor CURSOR FOR
        SELECT Keyword FROM ReplacementInformation WHERE Id = @FilterId

    OPEN LonelyCursor ; FETCH NEXT FROM LonelyCursor INTO @Keyword

    WHILE @@FETCH_STATUS = 0 -- While there still remains keywords to process.
    BEGIN
        WHILE 1 = 1 -- Not sure, but I think this nested loop can be unlooped if [FETCH NEXT] was cut & pasted to replace [BREAK].
        BEGIN
            IF(CHARINDEX(@Keyword, @TextToUpdate) = 0)
                BREAK -- If cannot find current keyword anymore, move on to next keyword.
            ELSE -- Otherwise, update text then check again for same keyword.
                SET @TextToUpdate = REPLACE(@TextToUpdate, @Keyword, CONCAT('Replaced_', @Keyword))
        END
        FETCH NEXT FROM LonelyCursor INTO @Keyword
    END

    CLOSE LonelyCursor ; DEALLOCATE LonelyCursor

    RETURN @TextToUpdate

END



  1. Opret en postgreSQL-database programmatisk

  2. hent 3 rækker hver dag, hvis du planlægger for 1 år

  3. Tilføjet mysql jar til lib, men står stadig over for klasse ikke fundet undtagelse på lokal udrulning til tomcat, der arbejder gennem intelliJ?

  4. ORA-00942:tabel eller visning findes ikke (ColdFusion-applikation)