Sql Server中常用的6个自定义函数分享

作者:junjie 时间:2024-01-17 05:05:40 

在日常应用中,往往根据实际需求录入一些值,而这些值不能直接使用,所以Sql中经常会对字段值进行一些常规的处理。这里搜集了(提取数字、英文、中文、过滤重复字符、分割字符的方法),方便日后查询使用。  

一、判断字段值是否有中文


--SQL 判断字段值是否有中文
create function fun_getCN(@str nvarchar(4000))  
returns nvarchar(4000)  
as  
begin  
declare @word nchar(1),@CN nvarchar(4000)  
set @CN=''  
while len(@str)>0  
begin  
set @word=left(@str,1)  
if unicode(@word) between 19968 and 19968+20901
  set @CN=@CN+@word
set @str=right(@str,len(@str)-1)  
end  
return @CN  
end  
select dbo.fun_getCN('ASDKG论坛KDL')
--论坛
select dbo.fun_getCN('ASDKG論壇KDL')
--論壇
select dbo.fun_getCN('ASDKDL')
--空

二、提取数字


IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL
DROP FUNCTION DBO.GET_NUMBER2
GO
CREATE FUNCTION DBO.GET_NUMBER2(@S VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
WHILE PATINDEX('%[^0-9]%',@S) > 0
BEGIN
set @s=stuff(@s,patindex('%[^0-9]%',@s),1,'')
END
RETURN @S
END
GO
--测试
PRINT DBO.GET_NUMBER('呵呵ABC123ABC')
GO
--123

三、提取英文


--提取英文
IF OBJECT_ID('DBO.GET_STR') IS NOT NULL
DROP FUNCTION DBO.GET_STR
GO
CREATE FUNCTION DBO.GET_STR(@S VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
WHILE PATINDEX('%[^a-z]%',@S) > 0
BEGIN
set @s=stuff(@s,patindex('%[^a-z]%',@s),1,'')
END
RETURN @S
END
GO
--测试
PRINT DBO.GET_STR('呵呵ABC123ABC')
GO

四、提取中文


--提取中文
IF OBJECT_ID('DBO.CHINA_STR') IS NOT NULL
DROP FUNCTION DBO.CHINA_STR
GO
CREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
WHILE PATINDEX('%[^吖-座]%',@S) > 0
SET @S = STUFF(@S,PATINDEX('%[^吖-座]%',@S),1,N'')
RETURN @S
END
GO
PRINT DBO.CHINA_STR('呵呵ABC123ABC')
GO

五、过滤重复字段(多种方法)


--过滤重复字符
IF OBJECT_ID('DBO.DISTINCT_STR') IS NOT NULL
DROP FUNCTION DBO.DISTINCT_STR
GO
CREATE FUNCTION DBO.DISTINCT_STR(@S NVARCHAR(100),@SPLIT VARCHAR(50))
RETURNS VARCHAR(100)
AS
BEGIN
IF @S IS NULL RETURN(NULL)
DECLARE @NEW VARCHAR(50),@INDEX INT,@TEMP VARCHAR(50)
IF LEFT(@S,1)<>@SPLIT
SET @S = @SPLIT+@S
IF RIGHT(@S,1)<>@SPLIT
SET @S = @S+@SPLIT
WHILE CHARINDEX(@SPLIT,@S)>0 AND LEN(@S)<>1
BEGIN
SET @INDEX = CHARINDEX(@SPLIT,@S)
SET @TEMP = LEFT(@S,CHARINDEX(@SPLIT,@S,@INDEX+LEN(@SPLIT)))
IF @NEW IS NULL
SET @NEW = ISNULL(@NEW,'')+@TEMP
ELSE
SET @NEW = ISNULL(@NEW,'')+REPLACE(@TEMP,@SPLIT,'')+@SPLIT
WHILE CHARINDEX(@TEMP,@S)>0
BEGIN
SET @S=STUFF(@S,CHARINDEX(@TEMP,@S)+LEN(@SPLIT),CHARINDEX(@SPLIT,@S,CHARINDEX(@TEMP,@S)+LEN(@SPLIT))-CHARINDEX(@TEMP,@S),'')
END
END
RETURN RIGHT(LEFT(@NEW,LEN(@NEW)-1),LEN(LEFT(@NEW,LEN(@NEW)-1))-1)
END
GO
PRINT DBO.DISTINCT_STR('A,A,B,C,C,B,C,',',')
--A,B,C
GO

--------------------------------------------------------------------
--过滤重复字符2
IF OBJECT_ID('DBO.DISTINCT_STR2') IS NOT NULL
DROP FUNCTION DBO.DISTINCT_STR2
GO
CREATE FUNCTION DBO.DISTINCT_STR2(@S varchar(8000))
RETURNS VARCHAR(100)
AS
BEGIN
IF @S IS NULL RETURN(NULL)
DECLARE @NEW VARCHAR(50),@INDEX INT,@TEMP VARCHAR(50)
WHILE LEN(@S)>0
BEGIN
SET @NEW=ISNULL(@NEW,'')+LEFT(@S,1)
SET @S=REPLACE(@S,LEFT(@S,1),'')
END
RETURN @NEW
END
GO
SELECT DBO.DISTINCT_STR2('AABCCD')
--ABCD
GO

六、根据特定字符串分割字段值


IF OBJECT_ID('DBO.SPLIT_STR') IS NOT NULL
DROP FUNCTION DBO.SPLIT_STR
GO
CREATE FUNCTION DBO.SPLIT_STR(
@S varchar(8000),   --包含多个数据项的字符串
@INDEX int,       --要获取的数据项的位置
@SPLIT varchar(10)   --数据分隔符
)
RETURNS VARCHAR(100)
AS
BEGIN
IF @S IS NULL RETURN(NULL)
DECLARE @SPLITLEN int
SELECT @SPLITLEN=LEN(@SPLIT+'A')-2
WHILE @INDEX>1 AND CHARINDEX(@SPLIT,@S+@SPLIT)>0
SELECT @INDEX=@INDEX-1,@S=STUFF(@S,1,CHARINDEX(@SPLIT,@S+@SPLIT)+@SPLITLEN,'')
RETURN(ISNULL(LEFT(@S,CHARINDEX(@SPLIT,@S+@SPLIT)-1),''))
END
GO
PRINT DBO.SPLIT_STR('AA|BB|CC',2,'|')
--
GO
标签:Sql,Server,自定义函数
0
投稿

猜你喜欢

  • 打包FlaskAdmin程序时关于static路径问题的解决

    2023-01-11 20:01:26
  • windows server 2003+IIS6 出现 'ASP 不正常,因为执行请求

    2010-05-07 11:02:00
  • MySQL延时复制库方法详解

    2024-01-26 14:21:51
  • python 爬取腾讯视频评论的实现步骤

    2021-06-19 03:57:58
  • 简单谈谈python中的多进程

    2023-05-13 15:19:17
  • TMDPHP 模板引擎使用教程

    2023-11-15 03:21:56
  • pandas中按行或列的值对数据排序的实现

    2023-09-23 02:32:18
  • 商业价值与用户价值的平衡

    2008-12-10 18:42:00
  • 浅谈python已知元素,获取元素索引(numpy,pandas)

    2023-08-04 16:01:00
  • Python+Qt身体特征识别人数统计源码窗体程序(使用步骤)

    2021-06-03 10:40:54
  • 基于python实现模拟数据结构模型

    2022-11-12 23:44:01
  • Python输出汉字字库及将文字转换为图片的方法

    2023-01-13 07:06:39
  • Java中使用正则表达式的一个简单例子及常用正则分享

    2023-05-06 09:03:16
  • HTML 标签是否匹配检测代码

    2010-03-17 20:50:00
  • 编写Python脚本抓取网络小说来制作自己的阅读器

    2022-11-06 18:51:03
  • 10行Python代码助你整理杂乱无章的文件

    2021-03-08 21:11:12
  • Python求导数的方法

    2023-11-22 07:51:15
  • 详解css定位与定位应用

    2007-05-11 16:52:00
  • python模块内置属性概念及实例

    2023-11-23 15:34:27
  • 基于生活形态的用户分群研究

    2009-12-30 16:54:00
  • asp之家 网络编程 m.aspxhome.com