经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
连续数字使用连接符替换
来源:cnblogs  作者:Insus.NET  时间:2019/5/28 9:07:59  对本文有异议

比如下面一串字符,把连续的数字使用“-”连接起来。

  1. DECLARE @Source NVARCHAR(MAX) = N'1,2,3,5,6,7,9,10,33,34,35,36,37,100,101,102,103,104,111,142,137,188,189,200,205,206'


结果要求如下:

 

解决问题,Insus.NET创建2个自定义函数:

 

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5. -- =============================================
  6. -- Author: Insus.NET
  7. -- Create date: 2019-05-27
  8. -- Update date: 2019-05-27
  9. -- Description: 分割字符串
  10. -- =============================================
  11.  
  12. CREATE FUNCTION [dbo].[tvf_SplitStringAsTwoField]
  13. (
  14. @Source NVARCHAR(MAX)
  15. )
  16. RETURNS @returnResult TABLE
  17. (
  18. [From] INT NOT NULL,
  19. [To] INT NOT NULL
  20. )
  21. AS
  22. BEGIN
  23. SET @Source = @Source + N',';
  24. IF CHARINDEX(',',@Source) > 0
  25. BEGIN
  26. WHILE CHARINDEX(',', @Source) > 0
  27. BEGIN
  28. DECLARE @CutoutString NVARCHAR(MAX) = SUBSTRING(@Source, 0, CHARINDEX(',', @Source))
  29. SET @Source = LTRIM(RTRIM(SUBSTRING(@Source, CHARINDEX(',', @Source) + 1, LEN(@Source))))
  30. DECLARE @from INT,@to INT
  31. SELECT TOP 1 @from = [From], @to = ([To]) FROM @returnResult ORDER BY [From] DESC
  32. IF @from IS NULL AND @to IS NULL
  33. INSERT INTO @returnResult ([From],[To]) VALUES(@CutoutString,@CutoutString)
  34. ELSE
  35. BEGIN
  36. IF @to + 1 = CAST(@CutoutString AS INT)
  37. UPDATE @returnResult SET [To] = @CutoutString WHERE [From] = @from
  38. ELSE
  39. INSERT INTO @returnResult ([From],[To]) VALUES(@CutoutString,@CutoutString)
  40. END
  41. END
  42. END
  43. ELSE
  44. INSERT INTO @returnResult ([From],[To]) VALUES(@Source,@Source)
  45. RETURN
  46. END
  47. GO
Source Code

 

另一个函数:

 

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5. -- =============================================
  6. -- Author: Insus.NET
  7. -- Create date: 2019-05-27
  8. -- Update date: 2019-05-27
  9. -- Description: 两个字段合并为一个
  10. CREATE FUNCTION [dbo].[svf_TwoFieldMergedToOne] (
  11. @field1 NVARCHAR(MAX),
  12. @field2 NVARCHAR(MAX)
  13. )
  14. RETURNS NVARCHAR(MAX)
  15. AS
  16. BEGIN
  17. DECLARE @rtv NVARCHAR(MAX)
  18. IF LEN(ISNULL(@field1,N'')) > 0 AND LEN(ISNULL(@field2,N'')) > 0
  19. BEGIN
  20. IF @field1 = @field2
  21. SET @rtv = @field1
  22. ELSE
  23. SET @rtv = @field1 + N'-' + @field2
  24. END
  25. ELSE IF LEN(ISNULL(@field1,N'')) > 0 AND LEN(ISNULL(@field2,N'')) = 0
  26. SET @rtv = @field1
  27. ELSE IF LEN(ISNULL(@field1,N'')) = 0 AND LEN(ISNULL(@field2,N'')) > 0
  28. SET @rtv = @field2
  29. ELSE
  30. SET @rtv = N''
  31.  
  32. RETURN @rtv
  33. END
  34. GO
Source Code

 

最后实现如下:

 

  1. ;WITH t AS
  2. (
  3. SELECT [From],[To] FROM [dbo].[tvf_SplitStringAsTwoField](@Source)
  4. )
  5. SELECT [From],[To],[dbo].[svf_TwoFieldMergedToOne]([From],[To]) AS [Result]
  6. FROM t
  7. GO
Source Code

 

原文链接:http://www.cnblogs.com/insus/p/10931687.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号