6

テーブルに方程式が保存されています。一度に 1 つの方程式を取得しており、すべての演算子を他の文字に置き換えたいと考えています。

入力文字列: (N_100-(6858)*(6858)*N_100/0_2)%N_35

演算子またはパターン: (+, -, *, /, %, (, ))

置換文字: ~

出力文字列: ~N_100~~6858~~~6858~~N_100~0_2~~N_35

ネストされた REPLACE関数を使用して以下のクエリを試したところ、目的の出力が得られました。

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

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 に答える
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 に答える