sql >> データベース >  >> RDS >> Sqlserver

SQL Server REPLACE()とTRANSLATE():違いは何ですか?

    SQL Server 2017以降、T-SQL TRANSLATE()を使用できるようになりました 1つまたは複数の文字を別の文字セットに変換する関数。

    一見すると、TRANSLATE()と思うかもしれませんが、 関数は、REPLACE()とまったく同じことを行います 機能しますが、2つの間に大きな違いがあります。

    定義

    まず、各関数の定義を見てみましょう。

    REPLACE()
    指定された文字列値のすべての出現箇所を別の文字列値に置き換えます。
    TRANSLATE()
    2番目の引数で指定された一部の文字が宛先の文字セットに変換された後、最初の引数として提供された文字列を返します。

    主な違いは、各関数が複数の文字を処理する方法です。 REPLACE() ある文字列を別の文字列に置き換えます。したがって、文字列に複数の文字が含まれている場合、各文字は同じ順序である必要があります。 TRANSLATE() 一方、文字の順序に関係なく、各文字を1つずつ置き換えます。

    例–同じ結果

    両方の関数が同じ結果を返す場合があります。このように:

    SELECT 
        REPLACE('123', '123', '456') AS Replace,
        TRANSLATE('123', '123', '456') AS Translate;
    

    結果:

    Replace  Translate
    -------  ---------
    456      456      
    

    この場合、REPLACE() 456を返します 2番目の引数の正確な文字列が最初の引数の文字列と一致したため(この場合は文字列全体でした)。

    TRANSLATE() 456を返します 2番目の引数の各文字が最初の引数に存在するためです。

    例–異なる結果

    次に、TRANSLATE()の違いの1つを示す例を示します。 およびREPLACE()

    SELECT 
        REPLACE('123', '321', '456') AS Replace,
        TRANSLATE('123', '321', '456') AS Translate;
    

    結果:

    Replace  Translate
    -------  ---------
    123      654      
    

    この場合、REPLACE() 2番目の引数が最初の引数(またはその中の部分文字列)と完全に一致しないため、効果はありません(元の文字列を返します)。 2番目の引数に正しい文字が含まれていても、それらは最初の引数と同じ順序ではないため、文字列全体が一致しません。

    TRANSLATE() します 2番目の引数の各文字が最初の引数に存在するため、効果があります。各文字は1つずつ翻訳されるため、順序が異なっていてもかまいません。 SQL Serverは、最初の文字、次に2番目、次に3番目というように変換します。

    非連続文字列

    前の例と同様に、最初の引数に2番目の引数の文字が含まれている場合でも、異なる結果を得ることができますが、それらは連続していません:

    SELECT 
        REPLACE('1car23', '123', '456') AS Replace,
        TRANSLATE('1car23', '123', '456') AS Translate;
    

    結果:

    Replace  Translate
    -------  ---------
    1car23   4car56   
    

    異なる長さの引数

    また、さまざまな引数の文字数に不一致がある場合は、関数ごとに異なる結果が得られる可能性があります。

    これは、最初の引数に含まれる文字が2番目と3番目の引数よりも少ない例です。

    SELECT 
        REPLACE('123', '1234', '4567') AS Replace,
        TRANSLATE('123', '1234', '4567') AS Translate;
    

    結果:

    Replace  Translate
    -------  ---------
    123      456      
    

    この場合、REPLACE() 2番目の引数には最初の引数よりも多くの文字が含まれているため、効果はありません。したがって、最初の引数に2番目の引数を含めることはできません。

    TRANSLATE() ただし、この場合、関数は効果があります。これは、2番目の引数に最初の引数に含まれる文字が含まれているためです。 2番目の引数に最初の引数よりも多くの文字が含まれていることは問題ではありません。最も重要なことは、3番目の引数に2番目の引数と同じ数の文字が含まれていることです。

    REPLACE()の場合もあります 完全に機能しますが、TRANSLATE() エラーをスローします。

    例:

    SELECT REPLACE('1234', '123', '4567') AS Replace;
    

    結果:

    Replace
    -------
    45674  
    

    この場合、REPLACE() 期待どおりに機能します。

    ただし、TRANSLATE()に同じ引数を指定した場合 、エラーが発生します:

    SELECT TRANSLATE('1234', '123', '4567') AS Translate;
    

    結果:

    Error: The second and third arguments of the TRANSLATE built-in function must contain an equal number of characters. 
    

    エラーメッセージに示されているように、2番目と3番目の引数には同じ数の文字が含まれている必要があります。

    REPLACE()はいつ使用する必要がありますか?

    REPLACE()を使用する必要があります 特定の文字列のすべての出現箇所を、記述されているとおりに置き換える必要がある場合。たとえば、誰かの名前を別の名前に変更します。

    TRANSLATE()の使用 このような場合、悲惨な結果を招く可能性があります:

    SELECT 
        REPLACE('Homer Simpson', 'Homer', 'Jason') AS Replace,
        TRANSLATE('Homer Simpson', 'Homer', 'Jason') AS Translate;

    結果:

    Replace        Translate    
    -------------  -------------
    Jason Simpson  Jason Sispsan
    

    TRANSLATE()はいつ使用する必要がありますか?

    前の例で示したように、TRANSLATE() 関数は、元の文字列内の順序に関係なく、指定された各文字のすべての出現箇所を置き換える必要がある場合に役立ちます。

    REPLACE()の代わりに使用することもできます 単にコードに。次に例を示します(Microsoft Webサイトの例に基づく):

    SELECT 
        REPLACE(REPLACE(REPLACE(REPLACE('2*[3+4]/{7-2}','[','('), ']', ')'), '{', '('), '}', ')') AS Replace,
        TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()') AS Translate;

    結果:

    Replace        Translate    
    -------------  -------------
    2*(3+4)/(7-2)  2*(3+4)/(7-2)
    


    1. ActiveRecord::AdapterNotSpecifiedデータベース構成がアダプターを指定していません

    2. Windows7へのOracle12cEnterpriseEditionのインストール

    3. Oracle10gExpressのホームページが表示されない

    4. BLOBをCLOBに変換する