社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 银行
  • 185阅读
  • 3回复

SQL函数:提取数字,提取英文,提取中文,过滤重复字符,过滤重复字符

楼层直达
级别: 管理员
  1. --提取数字
  2. IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL
  3. DROP FUNCTION DBO.GET_NUMBER2
  4. GO
  5. CREATE FUNCTION DBO.GET_NUMBER2(@S VARCHAR(100))
  6. RETURNS VARCHAR(100)
  7. AS
  8. BEGIN
  9. WHILE PATINDEX('%[^0-9]%',@S) > 0
  10. BEGIN
  11. set @s=stuff(@s,patindex('%[^0-9]%',@s),1,'')
  12. END
  13. RETURN @S
  14. END
  15. GO


--测试
  1. PRINT DBO.GET_NUMBER('呵呵ABC123ABC')
  2. GO

--123
--------------------------------------------------------------------
  1. --提取英文
  2. IF OBJECT_ID('DBO.GET_STR') IS NOT NULL
  3. DROP FUNCTION DBO.GET_STR
  4. GO
  5. CREATE FUNCTION DBO.GET_STR(@S VARCHAR(100))
  6. RETURNS VARCHAR(100)
  7. AS
  8. BEGIN
  9. WHILE PATINDEX('%[^a-z]%',@S) > 0
  10. BEGIN
  11. set @s=stuff(@s,patindex('%[^a-z]%',@s),1,'')
  12. END
  13. RETURN @S
  14. END
  15. GO

--测试
  1. PRINT DBO.GET_STR('呵呵ABC123ABC')
  2. GO

--------------------------------------------------------------------
  1. --提取中文
  2. IF OBJECT_ID('DBO.CHINA_STR') IS NOT NULL
  3. DROP FUNCTION DBO.CHINA_STR
  4. GO
  5. CREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100))
  6. RETURNS VARCHAR(100)
  7. AS
  8. BEGIN
  9. WHILE PATINDEX('%[^吖-座]%',@S) > 0
  10. SET @S = STUFF(@S,PATINDEX('%[^吖-座]%',@S),1,N'')
  11. RETURN @S
  12. END
  13. GO
  14. PRINT DBO.CHINA_STR('呵呵ABC123ABC')
  15. GO

--------------------------------------------------------------------
  1. --过滤重复字符
  2. IF OBJECT_ID('DBO.DISTINCT_STR') IS NOT NULL
  3. DROP FUNCTION DBO.DISTINCT_STR
  4. GO
  5. CREATE FUNCTION DBO.DISTINCT_STR(@S NVARCHAR(100),@SPLIT VARCHAR(50))
  6. RETURNS VARCHAR(100)
  7. AS
  8. BEGIN
  9. IF @S IS NULL RETURN(NULL)
  10. DECLARE @NEW VARCHAR(50),@INDEX INT,@TEMP VARCHAR(50)
  11. IF LEFT(@S,1)<>@SPLIT
  12. SET @S = @SPLIT+@S
  13. IF RIGHT(@S,1)<>@SPLIT
  14. SET @S = @S+@SPLIT
  15. WHILE CHARINDEX(@SPLIT,@S)>0 AND LEN(@S)<>1
  16. BEGIN
  17. SET @INDEX = CHARINDEX(@SPLIT,@S)
  18. SET @TEMP = LEFT(@S,CHARINDEX(@SPLIT,@S,@INDEX+LEN(@SPLIT)))
  19. IF @NEW IS NULL
  20. SET @NEW = ISNULL(@NEW,'')+@TEMP
  21. ELSE
  22. SET @NEW = ISNULL(@NEW,'')+REPLACE(@TEMP,@SPLIT,'')+@SPLIT
  23. WHILE CHARINDEX(@TEMP,@S)>0
  24. BEGIN
  25. SET @S=STUFF(@S,CHARINDEX(@TEMP,@S)+LEN(@SPLIT),CHARINDEX(@SPLIT,@S,CHARINDEX(@TEMP,@S)+LEN(@SPLIT))-CHARINDEX(@TEMP,@S),'')
  26. END
  27. END
  28. RETURN RIGHT(LEFT(@NEW,LEN(@NEW)-1),LEN(LEFT(@NEW,LEN(@NEW)-1))-1)
  29. END
  30. GO
  31. PRINT DBO.DISTINCT_STR('A,A,B,C,C,B,C,',',')
  32. --A,B,C
  33. GO

--------------------------------------------------------------------
  1. --过滤重复字符2
  2. IF OBJECT_ID('DBO.DISTINCT_STR2') IS NOT NULL
  3. DROP FUNCTION DBO.DISTINCT_STR2
  4. GO
  5. CREATE FUNCTION DBO.DISTINCT_STR2(@S varchar(8000))
  6. RETURNS VARCHAR(100)
  7. AS
  8. BEGIN
  9. IF @S IS NULL RETURN(NULL)
  10. DECLARE @NEW VARCHAR(50),@INDEX INT,@TEMP VARCHAR(50)
  11. WHILE LEN(@S)>0
  12. BEGIN
  13. SET @NEW=ISNULL(@NEW,'')+LEFT(@S,1)
  14. SET @S=REPLACE(@S,LEFT(@S,1),'')
  15. END
  16. RETURN @NEW
  17. END
  18. GO
  19. SELECT DBO.DISTINCT_STR2('AABCCD')
  20. --ABCD
  21. GO

--------------------------------------------------------------------
  1. IF OBJECT_ID('DBO.SPLIT_STR') IS NOT NULL
  2. DROP FUNCTION DBO.SPLIT_STR
  3. GO
  4. CREATE FUNCTION DBO.SPLIT_STR(
  5. @S varchar(8000),      --包含多个数据项的字符串
  6. @INDEX int,             --要获取的数据项的位置
  7. @SPLIT varchar(10)     --数据分隔符
  8. )
  9. RETURNS VARCHAR(100)
  10. AS
  11. BEGIN
  12. IF @S IS NULL RETURN(NULL)
  13. DECLARE @SPLITLEN int
  14. SELECT @SPLITLEN=LEN(@SPLIT+'A')-2
  15. WHILE @INDEX>1 AND CHARINDEX(@SPLIT,@S+@SPLIT)>0
  16. SELECT @INDEX=@INDEX-1,@S=STUFF(@S,1,CHARINDEX(@SPLIT,@S+@SPLIT)+@SPLITLEN,'')
  17. RETURN(ISNULL(LEFT(@S,CHARINDEX(@SPLIT,@S+@SPLIT)-1),''))
  18. END
  19. GO

PRINT DBO.SPLIT_STR('AA|BB|CC',2,'|')
--
GO
 
财软联盟交流①群:14186964 ②群:15329225??③群:15329240??④群:6152959 ⑤群:3148067 每天赚送10铜板
级别: 管理员
只看该作者 1 发表于: 2011-12-15
  1. --提取英文和数字
  2. IF OBJECT_ID('DBO.CHINA_STR') IS NOT NULL
  3. DROP FUNCTION DBO.CHINA_STR
  4. GO
  5. CREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100))
  6. RETURNS VARCHAR(100)
  7. AS
  8. BEGIN
  9. WHILE PATINDEX('%[^a-z^0-9]%',@S) > 0
  10. SET @S = STUFF(@S,PATINDEX('%[^a-z^0-9]%',@S),1,N'')
  11. --set @S=REPLACE(@S,@S,'')
  12. RETURN @S
  13. END
 
财软联盟交流①群:14186964 ②群:15329225??③群:15329240??④群:6152959 ⑤群:3148067 每天赚送10铜板
级别: 管理员
只看该作者 2 发表于: 03-20
  1. --提取英文和数字
  2. IF OBJECT_ID('DBO.CHINA_STR') IS NOT NULL
  3. DROP FUNCTION DBO.CHINA_STR
  4. GO
  5. CREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100))
  6. RETURNS VARCHAR(100)
  7. AS
  8. BEGIN
  9. declare @t NVARCHAR(4000)
  10. set @T='%[^a-z^0-9]%'
  11. WHILE PATINDEX(@T,@S) > 0
  12. SET @S = STUFF(@S,PATINDEX(@T,@S),1,N'')
  13. --set @S=REPLACE(@S,@S,'')
  14. RETURN @S
  15. END
 
财软联盟交流①群:14186964 ②群:15329225??③群:15329240??④群:6152959 ⑤群:3148067 每天赚送10铜板
级别: 管理员
只看该作者 3 发表于: 05-15
最终使用的


  1. ---提取中文
  2. IF OBJECT_ID('DBO.CHINA_STR') IS NOT NULL
  3. DROP FUNCTION DBO.CHINA_STR
  4. GO
  5. CREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100))
  6. RETURNS VARCHAR(100)
  7. AS
  8. BEGIN
  9. declare @t NVARCHAR(4000)
  10. set @T='%[^吖-座]%'
  11. WHILE PATINDEX(@t,@S) > 0
  12. SET @S = STUFF(@S,PATINDEX(@t,@S),1,N'')
  13. RETURN @S
  14. END
  15. GO
  16. PRINT DBO.CHINA_STR('呵呵ABC123ABC')
  17. GO


  1. ---提取英文和数字
  2. IF OBJECT_ID('DBO.CHINA_ENumber') IS NOT NULL
  3. DROP FUNCTION DBO.CHINA_ENumber
  4. GO
  5. CREATE FUNCTION DBO.CHINA_ENumber(@S NVARCHAR(100))
  6. RETURNS VARCHAR(100)
  7. AS
  8. BEGIN
  9. declare @t NVARCHAR(4000)
  10. set @T='%[^a-z^0-9^.]%'
  11. WHILE PATINDEX(@T,@S) > 0
  12. SET @S = STUFF(@S,PATINDEX(@T,@S),1,N'')
  13. RETURN @S
  14. END
  15. go
  16. PRINT DBO.CHINA_ENumber('呵呵ABC123.ABC')
  17. go
 
财软联盟交流①群:14186964 ②群:15329225??③群:15329240??④群:6152959 ⑤群:3148067 每天赚送10铜板