SQL文字列の前/後のサブ文字列を切り取る-カスタム関数


C#では、Index()またはLastIndexOf()とSubString()を組み合わせて、ある文字の前後のサブ文字列を取得できますが、sql serverではどのようにしてこの機能を実現すればいいのでしょうか.charindexとsubstringを組み合わせて間接的にこの機能を実現することができます.具体的な文は以下の通りです.
DECLARE @Name nvarchar(50)
SET @Name = '12345.abcde.ABCDEF'

DECLARE @Position int

--IndexOf  
SET @Position = CHARINDEX('.', @Name);
SELECT SUBSTRING (@Name, @Position+1,LEN(@Name)-@Position)
--result:'abcde.ABCDEF'
SELECT SUBSTRING (@Name, 0, @Position)
--result:'12345'

--LastIndexOf  
SET @Position =  LEN(@Name) - CHARINDEX('.', REVERSE(@Name)) + 1
SELECT SUBSTRING (@Name, @Position+1,LEN(@Name)-@Position)
--result:'ABCDEF'
SELECT SUBSTRING (@Name, 0, @Position)
--result:'12345.abcde'

もちろん、この2つの機能をそれぞれカスタム関数として作成し、必要に応じて直接呼び出すこともできます.次のようになります.
--      @str      @c,  @is_end 1   @c      , 0   @c      
CREATE FUNCTION [dbo].[IndexOf](@str NVARCHAR(500),@c CHAR(1),@is_end bit)
RETURNS @t TABLE
(
    id INT IDENTITY(1,1) not null,
    resultValue NVARCHAR(500)
)
AS
BEGIN
    DECLARE @position INT
    SET @position=CHARINDEX(@c,@str);
    IF @is_end=1
        INSERT @t (resultValue) VALUES (SUBSTRING(@str, @position+1,LEN(@str)-@position))
    ELSE IF @is_end=0
        INSERT @t (resultValue) VALUES (SUBSTRING (@str, 0, @Position))
    RETURN
END
go

--    
SELECT resultValue FROM [dbo].IndexOf('12345.abcde.ABCDEF','.',1)
--    
abcde.ABCDEF

--    
SELECT resultValue FROM [dbo].IndexOf('12345.abcde.ABCDEF','.',0)
--    
12345

--      @str      @c,  @is_end 1   @c      , 0   @c      
CREATE FUNCTION [dbo].[LastIndexOf](@str NVARCHAR(500),@c CHAR(1),@is_end bit)
RETURNS @t TABLE
(
    id INT IDENTITY(1,1) not null,
    resultValue NVARCHAR(500)
)
AS
BEGIN
    DECLARE @position INT
    SET @position=LEN(@str) - CHARINDEX('.', REVERSE(@str)) + 1
    IF @is_end=1
        INSERT @t (resultValue) VALUES (SUBSTRING (@str, @position+1,LEN(@str)-@position))
    ELSE IF @is_end=0
        INSERT @t (resultValue) VALUES (SUBSTRING (@str, 0, @position))
    RETURN
END
go

--    
SELECT resultValue FROM [dbo].LastIndexOf('12345.abcde.ABCDEF','.',1)
--    
ABCDEF

--    
SELECT resultValue FROM [dbo].LastIndexOf('12345.abcde.ABCDEF','.',0)
--    
12345.abcde