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

Jak provést vnořenou náhradu hodnot z jiné tabulky?

Odmítnutí odpovědnosti:Funkce se zeštíhlila, jak bylo slíbeno, včas odpovídajícím způsobem aktualizuje popis odpovědi.

Podle mého současného chápání vašeho problému si myslím, že na něj mohu použít funkci, kterou jsem navrhl k vyřešení složitějšího problému, který jsem měl nedávno. Mohou existovat i jiná řešení, ale s největší pravděpodobností je mohou a navrhnou jiní, tak proč vám nenabídnu o něco méně.

Upozorňujeme, že to bylo určeno k řešení něčeho složitějšího, než je ten váš (vysvětleno později ) a právě teď Bohužel nemám čas to zeštíhlit, ale zítra se k tomu dostanu. Doufám, že komentáře pomohou. Bez ohledu na to vám shrnu cíl své funkce:

Existuje tabulka, která obsahuje, jaké zprávy najít a čím je nahradit. Funkce obdrží jako vstup textovou hodnotu, použije kurzor k zacyklení uvedené tabulky a pro každý záznam v této tabulce zkontroluje, zda vstupní text obsahuje něco, co je třeba nahradit, a případně nahradit.

K původnímu cíli je třeba poznamenat dvě věci. Za prvé existuje vnořená smyčka, která řeší scénář, kdy určité klíčové slovo existuje vícekrát, a proto vyžaduje vícenásobné nahrazení. Zadruhé Musel jsem se také vypořádat se zástupnými znaky, proměnnými délkami a tím, zda je v diskutované tabulce nastaven příznak nahrazení. Tyto dvě věci plus další jsou pravděpodobně důvodem, proč najdete spoustu podivného materiálu poletujícího kolem.

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. Použití příkazu Python pro příkaz SQL INSERT

  2. Spark SQL/Hive Query trvá věčnost s připojením

  3. PostgreSQL role drop selže kvůli výchozím oprávněním

  4. Jak dekódovat hex bajtového sloupce PostgreSQL na int16/uint16 v r?