SQL 字符串函数
/* 1、字符替换函数,类似PB里的replace函数 */
--STUFF ( character_expression , start , length , character_expression )
SELECT STUFF('abcdef', 3,2, 'IJK');
--结果:abIJKdef
--说明:把前面第三个字符开始的两个长度位置替换成后面的字符串
/* 2、正则函数 */
--PATINDEX ( '%pattern%' , expression )
select patindex('%[0-9]%','dcds23')
--结果:5
--说明:返回第一个数字在字符串中出现的位置
/* 截取字符串中的汉字 */
declare @s varchar(100),@i int
set @s = '12A测试shu汉字ju'
set @i = patindex('%[^吖-咗]%',@s)
while @i >0
begin
set @s = stuff(@s,@i,1,'')
set @i = patindex('%[^吖-咗]%',@s)
end
print @s
/* 封装成函数,函数功能,返回字符串中的所有汉字 */
if object_id('getHZ') is not null drop function getHZ
go
create function getHZ(@s varchar(100)) returns varchar(100)
as
begin
declare @i int;
set @i = patindex('%[^吖-咗]%',@s)
while @i >0
begin
set @s = stuff(@s,@i,1,'')
set @i = patindex('%[^吖-咗]%',@s)
end
return @s
end
go
print dbo.getHZ('ddd哈哈,测试fff');
/* 3、查找函数 */
-- CHARINDEX ( expression1 , expression2 [ , start_location ] )
select charindex('汉字','ss汉字dfff');
--3
/* 4、截取函数 */
-- SUBSTRING ( expression , start , length )
select substring('123456',2,3);
--234
/* 5、字符串长度函数 */
--返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格。
--LEN ( string_expression )
select len('ddd ');
--3
select len(' ddd ');
--5
select len('ddd ddd');
--7
select len('测试')
--2
/* 字符串按分隔符位置截取函数 */
IF OBJECT_ID('poscopy') IS NOT NULL
drop function poscopy
GO
create function poscopy(
@S varchar(2000), --包含多个数据项的字符串
@SPLIT varchar(10), --数据分隔符
@INDEX int --要获取的数据项的位置
)
returns varchar(200)
AS
begin
if (@S is null or @s='') return ''
if (@SPLIT is null or @SPLIT = '') return ''
if @INDEX < 1 return ''
declare @CUTLEN int;
set @CUTLEN = CHARINDEX(@SPLIT,@S+@SPLIT)
while @INDEX>1 AND @CUTLEN>0
begin
set @INDEX=@INDEX-1;
set @S=STUFF(@S,1,@CUTLEN,'');
set @CUTLEN = CHARINDEX(@SPLIT,@S+@SPLIT);
end
return (ISNULL(LEFT(@S,@CUTLEN-1),''))
END
--字顶顶顶顶
GO
/* 获取字符串分隔符位置函数 */
if object_id('posnum') is not null drop function posnum
go
create function posnum(
@s varchar(2000),
@split varchar(10)
)
returns int
as
begin
if (@S is null or @s='') return 0
if (@SPLIT is null or @SPLIT = '') return 0
declare @Num int,@slen int;
set @Num = 0;
set @slen = charindex(@split,@s);
while @slen > 0
begin
set @Num = @Num + 1;
set @s = stuff(@s,1,@slen,'');
set @slen = charindex(@split,@s);
end
if @s <> ''
set @num = @num + 1;
return @Num;
end
go
print dbo.posnum('aaa|dd','|');
--2
print dbo.posnum('aaa|dd|','|');
--2
print dbo.posnum('aaa汉字dd','汉字');
--2