SQL智能替换

时间:2017-03-21 13:48:53

标签: sql sql-server

我在SQL Server 2005数据库中有包含以下内容的记录:

longlongLongText###abcdefg###longlongLongText 

(每个记录中可以是不同的字母,可能或多或少是字母。模式### abcdefg ###将是长字符串的一部分。)

我想更新记录,所以我只保留前3个字母。结果将是

longlongLongText###abc###longlongLongText

有可能吗?

感谢。

4 个答案:

答案 0 :(得分:2)

这应该有效:

Update YourTable

Set YourField = left(YourField,CHARINDEX('###', YourField)-1) + substring(YourField, CHARINDEX('###', YourField),6) + right(YourField, len(YourField) - CHARINDEX('###', YourField) - 8)

where CHARINDEX('###', YourField)>0

- 左侧函数将返回长字符串的左侧部分,直到达到“###”

- substring函数将返回从第一个'###'开始并包含前3个字符的子字符串。

- 右边的函数将从第二个'###'

开始返回正确的子字符串

您可以在此处试用:Fiddle

答案 1 :(得分:1)

这样做你想要的吗?

select left(str, 6) + '###'

或者:

select '###' + left(replace(str, '#', ''), 3) + '###'

如果中间只有一个或两个字母,这样会更好。

答案 2 :(得分:0)

创建如下的简单函数:

create function fnReplaceByPattern(@s varchar(max)) returns varchar(max)
begin
    declare @pos int = 1;
    declare @len int = len(@s);

    declare @result varchar(max) = '';

    while @pos < @len
    begin
        declare @start int = charindex('###', @s, @pos);
        declare @end int = charindex('###', @s, @start + 3);

        if @start != 0 and @end != 0
        begin
            set @result += substring(@s, @pos, @start - @pos + 6) + '###';
            set @pos = @end + 3;
        end
        else
        begin
            set @result += substring(@s, @pos, @len - @pos + 1);
            set @pos = @len;
        end
    end

    return @result
end

然后使用update T1 set Data = dbo.fnReplaceByPattern(Data)

答案 3 :(得分:0)

试试这个:

替换&#34; col1&#34;使用您的列名。

update yourtable
        SET col1 = substring(col1,0,charindex('###',col1)-1)+substring(col1,charindex('###',col1),6)+ substring(col1,CHARINDEX('###',col1,(charindex('###',col1)+1)), (len(col1)-CHARINDEX('###',col1,(charindex('###',col1)))))

here你可以看到并测试

希望这个帮助