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
投稿

猜你喜欢

  • MySQL数据表分区策略及优缺点分析

    2024-01-22 05:37:19
  • js判断变量是否未定义的代码

    2023-08-16 03:43:27
  • 使用Django和Python创建Json response的方法

    2022-04-28 13:08:42
  • 标签水平右对齐更适合中文网站

    2009-05-01 11:54:00
  • Python词云的正确实现方法实例

    2021-08-05 10:53:41
  • Go 中 time.After 可能导致的内存泄露问题解析

    2024-02-03 13:05:16
  • Python 带星号(* 或 **)的函数参数详解

    2023-04-25 22:36:40
  • PHP实现页面静态化的超简单方法

    2023-11-18 17:13:24
  • 删除mysql数据表如何操作

    2024-01-26 01:22:20
  • ThinkPHP开发框架函数详解:C方法

    2023-10-18 03:27:04
  • python jenkins 打包构建代码的示例代码

    2022-10-05 02:22:02
  • 多个版本的python共存时使用pip的正确做法

    2021-06-24 10:41:17
  • GoLang bytes.Buffer基础使用方法详解

    2024-04-27 15:28:09
  • Python德劳内三角剖分详解

    2021-02-18 23:08:49
  • ASP程序种如何调用DLL文件

    2008-01-15 19:12:00
  • 使用python实现ftp的文件读写方法

    2022-02-06 11:25:03
  • python+selenium操作下拉框

    2021-11-16 13:43:30
  • 详解如何修改jupyter notebook的默认目录和默认浏览器

    2022-07-01 14:34:54
  • vue3中使用Apache ECharts的详细方法

    2024-04-26 17:41:01
  • 如何利用JSHint减少JavaScript的错误

    2024-05-28 15:37:40
  • asp之家 网络编程 m.aspxhome.com