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'

当然我们也可以将这两种功能分别创建成自定义函数,需要时直接调用即可。如下:

--从前面开始在@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

你可能感兴趣的:(Sql,Server基础进阶系列)