6

我的表中存储了一个方程式。我一次获取一个方程,并想用任何其他字符替换所有运算符。

输入字符串: (N_100-(6858)*(6858)*N_100/0_2)%N_35

运算符或模式: (+, -, *, /, %, (, ))

替换字符: ~

输出字符串: ~N_100~~6858~~~6858~~N_100~0_2~~N_35

我曾尝试使用嵌套替换函数进行以下查询,并且得到了所需的输出:

DECLARE @NEWSTRING VARCHAR(100) 
SET @NEWSTRING = '(N_100-(6858)*(6858)*N_100/0_2)%N_35' ;
SELECT @NEWSTRING = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
                    @NEWSTRING, '+', '~'), '-', '~'), '*', '~'), '/', '~')
                   , '%', '~'), '(', '~'), ')', '~')
PRINT @NEWSTRING

输出: ~N_100~~6858~~~6858~~N_100~0_2~~N_35

如何在不使用嵌套替换函数的情况下替换所有运算符?

4

5 回答 5

12

我相信如果您使用表格来驱动它,它会更容易且更具可读性。

declare @String varchar(max) = '(N_100-(6858)*(6858)*N_100/0_2)%N_35'

--table containing values to be replaced
create table #Replace 
(
    StringToReplace varchar(100) not null primary key clustered
    ,ReplacementString varchar(100) not null    
)

insert into #Replace (StringToReplace, ReplacementString)
values ('+', '~')
    ,('-', '~')
    ,('*', '~')
    ,('/', '~')
    ,('%', '~')
    ,('(', '~')
    ,(')', '~')

select @String = replace(@String, StringToReplace, ReplacementString)
from #Replace a

select @String

drop table #Replace
于 2014-12-18T16:18:28.497 回答
5

SQL Server 中 Oracle 的 TRANSLATE 函数没有等效功能,您必须使用嵌套替换函数。

以下解决方案在技术上是正确的:

DECLARE @newstring VARCHAR(100) = '(N_100-(6858)*(6858)*N_100/0_2)%N_35';
DECLARE @pattern VARCHAR(100) = '%[+-\*/%()]%';
DECLARE @i INT;
BEGIN
  SET @i = PATINDEX(@pattern,@newstring) 
  WHILE @i <> 0
  BEGIN
    SET @newstring = LEFT(@newstring,@i-1) + '~' + SUBSTRING(@newstring,@i+1,100);
    SET @i = PATINDEX(@pattern,@newstring) 
  END
  SELECT @newstring;
END;

但我不明白为什么你会喜欢这个而不是嵌套的 REPLACE 调用。

于 2013-11-07T11:52:32.553 回答
1

最简单的方法是使用TRANSLATE函数。它可以从SQL Server 2017 (aka vNext)上面获得。

TRANSLATE

在将第二个参数中指定的某些字符转换为目标字符集后,返回作为第一个参数提供的字符串。

TRANSLATE ( inputString, characters, translations) 

返回与 inputString 相同类型的字符表达式,其中第二个参数中的字符被替换为第三个参数中的匹配字符。

在你的情况下:

SELECT TRANSLATE('(N_100-(6858)*(6858)*N_100/0_2)%N_35', '+-*/%()','~~~~~~~')

DBFiddle 演示

于 2016-12-28T17:10:12.153 回答
0

我创建了一个SPLIT函数来实现它,因为我需要多次实现这个操作PROCEDURE

分割功能

create function [dbo].[Split](@String varchar(8000), @Delimiter char(1))       
returns @temptable TABLE (items varchar(8000))       
as       
begin       
    declare @idx int       
    declare @slice varchar(8000)       

    select @idx = 1       
        if len(@String)<1 or @String is null  return       

    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)       
        else       
            set @slice = @String       

        if(len(@slice)>0)  
            insert into @temptable(Items) values(@slice)       

        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return       
end

程序中使用的代码:

DECLARE @NEWSTRING VARCHAR(100) 
SET @NEWSTRING = '(N_100-(6858)*(6858)*N_100/0_2)%N_35' ;
SELECT @NEWSTRING = REPLACE(@NEWSTRING, items, '~') FROM dbo.Split('+,-,*,/,%,(,)', ',');
PRINT @NEWSTRING

输出

~N_100~~6858~~~6858~~N_100~0_2~~N_35
于 2014-01-10T04:57:55.140 回答
0

您可以在不使用嵌套替换函数的情况下替换所有运算符

DECLARE @Pattern VARCHAR(300) ='%[+-\*/%()]%';
DECLARE @String VARCHAR(300) ='(N_100-(6858)*(6858)*N_100/0_2)%N_35';
WHILE PatIndex(@Pattern, @String) <> 0
    SELECT @String=Replace(@String, Substring(@String, PatIndex(@Pattern, @String), 1), '~')
SELECT @String 
于 2019-11-21T11:29:16.200 回答