SQL Сервер - заменить строку по внешнему виду - PullRequest
5 голосов
/ 11 февраля 2020

У меня небольшой вопрос ... это тестовые данные

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} иногда или никогда ... и столбцы ParamValue1, ParamValue2 , ParamValue3 ... Как можно заменить первые вхождения слова {param} значением столбца ParamValue1, вторым словом {param} значением столбца ParamValue2 и третьим значением столбца ParamValue3 .. Я не могу изменить слово {param} на {param1}, {param2} и {param3} и go с простой заменой

Пока мне удалось заменить только первое вхождение ...

SELECT CASE 
        WHEN CHARINDEX('{param}', DESCRIPTION) > 0
            THEN STUFF(DESCRIPTION, CHARINDEX('{param}', DESCRIPTION), LEN('{param}'), ParamValue1)
        ELSE DESCRIPTION
        END
FROM #TestReplace

Это легко удалось сделать в Oracle (Oracle - заменить строку на внешний вид )

1 Ответ

6 голосов
/ 11 февраля 2020

Вы можете связать их вместе, используя 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);
...