SQL Server-按外观替换字符串

标签 sql sql-server replace

有一个小问题...这是测试数据

CREATE TABLE #TestReplace (
    Description NVARCHAR(500)
    ,ParamValue1 INT
    ,ParamValue2 INT
    ,ParamValue3 INT
    );

INSERT INTO #TestReplace (Description)
VALUES ('This sentence has no parameteres, and it should be shown like this');

INSERT INTO #TestReplace (
    Description
    ,ParamValue1
    )
VALUES (
    'This sentence has only one parametere, and it should be shown right here {param} with rest of text'
    ,100
    );

INSERT INTO #TestReplace (
    Description
    ,ParamValue1
    ,ParamValue2
    )
VALUES (
    'This sentence has two parameteres, one here {param} and one here {param}, show full sentence'
    ,100
    ,200
    );

INSERT INTO #TestReplace (
    Description
    ,ParamValue1
    ,ParamValue2
    ,ParamValue3
    )
VALUES (
    'This sentence has all parameteres, here {param} and here {param} and there {param}'
    ,100
    ,200
    ,300
    );

在我的句子中,有时会出现单词{param},或者永远不会出现...,而列ParamValue1ParamValue2ParamValue3 ...如何将单词{param}的第一次出现替换为ParamValue1列的值,将第二个单词{param}替换为ParamValue2列的值第三列带有ParamValue3列的值...我无法将单词{param}更改为{param1}{param2}{param3}并进行简单替换

到目前为止,我设法只替换了第一次出现的情况...
SELECT CASE 
        WHEN CHARINDEX('{param}', DESCRIPTION) > 0
            THEN STUFF(DESCRIPTION, CHARINDEX('{param}', DESCRIPTION), LEN('{param}'), ParamValue1)
        ELSE DESCRIPTION
        END
FROM #TestReplace

在Oracle(Oracle - replace string by appearance)中可以轻松地对此进行管理

最佳答案

您可以使用APPLY将它们链接在一起:

SELECT COALESCE(v3.DESCRIPTION, v2.DESCRIPTION, v1.DESCRIPTION, tr.DESCRIPTION)
FROM #TestReplace tr CROSS APPLY
     (VALUES (CASE WHEN tr.Description LIKE '%{param}%'
                   THEN STUFF(tr.DESCRIPTION, CHARINDEX('{param}', tr.DESCRIPTION), LEN('{param}'), tr.ParamValue1)
              END)
     ) v1(description) CROSS APPLY
     (VALUES (CASE WHEN v1.Description LIKE '%{param}%'
                   THEN STUFF(v1.DESCRIPTION, CHARINDEX('{param}', v1.DESCRIPTION), LEN('{param}'), tr.ParamValue2)
              END)
     ) v2(description) CROSS APPLY
     (VALUES (CASE WHEN v2.Description LIKE '%{param}%'
                   THEN STUFF(v2.DESCRIPTION, CHARINDEX('{param}', v2.DESCRIPTION), LEN('{param}'), ParamValue3)
              END)
     ) v3(description);

关于SQL Server-按外观替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60167785/

相关文章:

mysql - 如何在 SQL 上创建多值属性

SQL 查询 - 需要优雅的解决方案

python - 替换有时加倍的字符的单个实例

sql - Bash 清除脚本

sql - '='附近的语法不正确

java - 将 MS SQL 驱动程序安装到 Eclipse Maven 中

c# - 如何从 .aspx 中读取用户输入并将其存储在 .aspx.cs 中的 SQL Server 数据库中

JavaScript - 在所有出现的情况下替换字符串中的变量

wpf - Delphi 中的 Dxscene 和 VGscene

SQL ORDER BY 日期问题