在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