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

SQL Server(T-SQL)で文字列内の複数の文字を置き換える

    SQL Serverでは、REPLACE() 関数を使用すると、文字列を別の文字列に置き換えることができます。しかし、文字のリストを別の文字のリストに置き換えたい場合はどうでしょうか?

    TRANSLATE() 機能が役立つかもしれません。

    TRANSLATE()に関するMicrosoftの説明は次のとおりです。 機能:

    2番目の引数で指定された一部の文字が、3番目の引数で指定された宛先の文字セットに変換された後、最初の引数として提供された文字列を返します。

    泥のように澄んでいますか?

    これは、例として本当に叫ぶ時期の1つだと思います。

    SELECT TRANSLATE('Fred [10 points]', '[]', '()');

    結果:

    Fred (10 points)

    基本的には、別の値のリストを置き換えるために値のリストを提供したかのようです。ただし、各リストアイテムを区切り文字で区切る必要はありません。

    同数の文字

    2番目と3番目の引数には、同じ数の文字が含まれている必要があります。

    つまり、これを行うことはできません:

    SELECT TRANSLATE('Fred [10 points]', '[]', '(');

    結果:

    Msg 9828, Level 16, State 1, Line 1
    The second and third arguments of the TRANSLATE built-in function must contain an equal number of characters.

    この場合、2番目の引数には2つの文字が含まれていますが、3番目の引数には1つしか含まれていないため、エラーが発生します。

    これは、SQLServerが2番目の引数の2番目の文字を置き換える文字を知る必要があるために発生します。各文字を1つずつ調べ、3番目の引数の対応する文字に置き換えます。存在しない場合は、エラーをスローする以外に選択肢はありません。

    REPLACE()との比較

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

    SELECT 
      REPLACE('[] [hey]', '[]', '()') AS REPLACE,
      TRANSLATE('[] [hey]', '[]', '()') AS TRANSLATE;

    結果:

    +-----------+-------------+
     | REPLACE   | TRANSLATE   |
     |-----------+-------------|
     | () [hey]  | () (hey)    |
     +-----------+-------------+ 

    REPLACE() 関数は[hey]を離れます その文字列全体が2番目の引数で提供されなかったため、そのままです。この関数は、文字列全体が存在する場合にのみ一致を検索します。

    TRANSLATE() 一方、関数は[hey]を置き換えます (hey)で 各文字を置き換えるため 一つずつ。置き換える文字列全体を探すのではなく、個々の文字を個別に探すだけです。


    1. JOOQを使用してPostgreSQLにJSON列を含む更新可能なレコードを挿入するにはどうすればよいですか?

    2. スキーマスナップショットを使用したデータベースの複数のバージョンの作成と展開

    3. DockerでのMariaDBMaxScaleロードバランシング:デプロイメント:パート1

    4. SQLクエリを高速化する方法