Использование шаблонов в REPLACE - PullRequest
0 голосов
/ 05 марта 2012

Мне нужно найти и заменить выражение в динамическом запросе. У меня есть подмножество условия where в строковом типе, как

'fieldA=23 OR field_1=300 OR fieldB=4'

Мне нужно найти способ обнаружить выражение field_1 = 300 в строке и заменить его, сохранив выражение field_1 = 300.

Я могу выполнить часть обнаружения, используя CHARINDEX или PATINDEX, но я не могу понять, как использовать шаблоны в функции REPLACE и как получить значение параметра field_1.

Заранее спасибо.

1 Ответ

1 голос
/ 17 марта 2012

Я не совсем понимаю, что вы пытаетесь достичь (например, что вы хотите заменить "field_1 = 300", и это именно та строка "field_1 = 300", которую вы ищете,или просто имя поля, то есть "field_1"?).

Кроме того, не могли бы вы вставить код, который вы написали до сих пор?

Вот простой скрипт, который будет извлекать текущее значениес заданным именем поля:

DECLARE @str VARCHAR(100),
        @str_tmp VARCHAR(100),
        @field_pattern VARCHAR(10),
        @field_val INT;

SET @str = 'fieldA=23 OR field_1=300 OR fieldB=4';
SET @field_pattern = 'field_1='

-- This part will extract the current value assigned to the "@field_pattern" field
IF CHARINDEX(@field_pattern, @str) > 0
BEGIN
    SELECT @str_tmp = SUBSTRING(@str, 
                        CHARINDEX(@field_pattern, @str) + LEN(@field_pattern),
                        LEN(@str)
                        );

    SELECT @field_val = CAST(SUBSTRING(@str_tmp, 1, CHARINDEX(' ', @str_tmp)-1) AS INT);
END

PRINT @field_val

Если вы хотите заменить само значение (например, заменить «300» в данном случае на «600»), вы можете добавить что-то вроде этого:

DECLARE @new_val INT;
SET @new_val = 600;
SET @str = REPLACE(@str, (@field_pattern+CAST(@field_val AS VARCHAR)), (@field_pattern+CAST(@new_val AS VARCHAR)));
PRINT @str;

Что даст вам "fieldA=23 OR field_1=600 OR fieldB=4".

Приветствия, Дейв

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...