プレフィックスやサフィックスを取得する

目的とする文字列が「社長」だったとして、「副社長」の「副」*1を取得したり「社長代理」の「代理」*2を取得することを考えます。

取得元の文字列には目的とする文字列が必ず含まれるとして、プレフィックスとサフィックスの両方は含まれないとします。

下記のコードで@all_valueは取得元の全体文字列、@fix_valueは目的とする固定文字列です。

まずは簡単なサフィックス

固定文字列よりも長い部分がサフィックスなので簡単です。

/*
 GetSuffix: サフィックスを取得する

 ■実行例
   dbo.GetSuffix('社長代理', '社長') = '代理'
*/

CREATE FUNCTION [dbo].[GetSuffix]
(
    @all_value varchar(8000),
    @fix_value varchar(8000)
)
RETURNS varchar(8000)
AS
BEGIN
    RETURN SUBSTRING(@all_value, LEN(@fix_value) + 1, LEN(@all_value) - LEN(@fix_value))
END

ちょっと面倒くさいプレフィックス

評価する前に文字列を反転してサフィックス取得処理を行い、結果をまた反転すれば正解が得られます。

/*
 GetPrefix: サフィックスを取得する

 ■実行例
   dbo.GetPrefix('副社長', '社長') = '副'
*/

CREATE FUNCTION [dbo].[GetPrefix]
(
    @all_value varchar(8000),
    @fix_value varchar(8000)
)
RETURNS varchar(8000)
AS
BEGIN
    RETURN REVERSE(dbo.GetSuffix(REVERSE(@all_value), @fix_value))
END

プレフィックスとサフィックスの両方を扱うには

PATINDEX関数を使って切り分けないとダメですね。今回は必要なかったので作ってません。

*1:プレフィックスのつもりw

*2:サフィックスのつもりw