都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

便利な SQL の関数とか、構文とか、その他色々まとめてみる - その18 ( 令和元年記念投稿 )

 平成も終わり、令和が始まりました。平成最後の年は、自分自身として人生の転機でした。ただ、まだまだ進化はしていきたいので、変化を恐れず進んでいきたいと思っています。
 今回は、TRANSLATE (Transact-SQL) - SQL Server | Microsoft Docs について説明します。一見、REPLACE (Transact-SQL) - SQL Server | Microsoft Docs 似ていますが、REPLACE では複雑になってしまう処理も TRANSLATE では非常に簡潔に記述することが可能です。それでは、REPLACE と TRANSLATE で記述内容を比較してみましょう。下記のクエリを SQL Server Management Studio で実行してみましょう。

DECLARE @str NVARCHAR(255) = 'aaa,aaa,aaa|bbb,bbb,bbb'

SELECT
    REPLACE(REPLACE(REPLACE(@str,'|','*'),',','|'),'*',',') [REPLACE],
    TRANSLATE(@str, ',|', '|,') [TRANSLATE]

f:id:koogucc11:20190429083951p:plain
REPLACE と TRANSLATE の実行結果

 TRANSLATE は下記の部分が特徴となります。

TRANSLATE 関数の動作は、複数の REPLACE 関数を使用した場合と似ています。 ただし、TRANSLATE では文字が複数回置き換えられることはありません。 これは、使用するたびに関連するすべての文字が置き換えられる複数の REPLACE 関数とは異なります。

 ストアドプロシージャでよく RELACE 関数が何重にも入れ子になっている処理を見かけることがあります。全ての場合において使用できるわけではありませんが、TRANSLATE を使って、複雑になってしまったストアドプロシージャをリファクタリングしましょう。