sql >> データベース >  >> RDS >> Sqlserver

別のテーブルの値をネストして置換する方法は?

    免責事項:機能は約束どおりスリム化されており、適切な時期に回答の説明が更新されます。

    あなたの問題についての私の現在の理解によれば、最近発生したより複雑な問題を解決するために設計した機能をそれに適用できると思います。他の解決策があるかもしれませんが、他の人がそれらを提案できることは間違いありません。

    ただし、これはあなたのものよりも複雑な問題に対処するためのものであることに注意してください (後で説明 )、そして 残念ながら、それをスリム化する時間がありませんが、おそらく明日に到達します.コメントがお役に立てば幸いです。とにかく、私はあなたのために私の機能の目的を要約します:

    検索するメッセージと、それらを置き換えるメッセージを含むテーブルがあります。この関数はテキスト値を入力として受け取り、カーソルを使用してテーブルをループし、テーブル内の各レコードについて、入力テキストに置換するものが含まれているかどうかを確認し、該当する場合は置換します。

    本来の目的について注意すべき点が 2 つあります。 まず 特定のキーワードが複数回存在するシナリオに対処するためのネストされたループがあり、複数の置換が必要になります。 第二に、 ワイルドカード、可変長、および議論されたテーブルで置換フラグが設定されているかどうかについても対処する必要がありました。これらの 2 つのこととその他のことが原因で、多くの奇妙な素材が飛び交っています。

    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. Oracle-単一の行を複数の行に分割

    2. データベースから複数のドロップダウンリストに入力するjquery

    3. PostgreSQLで自動インクリメントの主キーを設定するにはどうすればよいですか?

    4. Railsを使用してhstoreに配列を保存できますか