SQL文字列の前/後のサブ文字列を切り取る-カスタム関数
6526 ワード
C#では、Index()またはLastIndexOf()とSubString()を組み合わせて、ある文字の前後のサブ文字列を取得できますが、sql serverではどのようにしてこの機能を実現すればいいのでしょうか.charindexとsubstringを組み合わせて間接的にこの機能を実現することができます.具体的な文は以下の通りです.
もちろん、この2つの機能をそれぞれカスタム関数として作成し、必要に応じて直接呼び出すこともできます.次のようになります.
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