利用SQL进行字符串切分统计

背景:

        数据库:SQLSERVER 2008

原始数据表(TestTable)如下,需要统计每个数字出现的个数,不希望在程序中全部取出后逐个切分相加,所以想到用SQL实现切分统计

  1. colunname
  2. 02;03;04
  3. 01
  4. 01;02;03
  5. 02;03
  6. 02;03;04
  7. 01
  8. 02;04
  9. 01;03
  10. 01;02
  11. 02;05
  12. 01
  13. 02
  14. 03
  15. 01;02
  16. 01
  17. 01
  18. 01;03
  19. 01;02
  20. 02

实现:利用 master..spt_values系统表的自增常量切分

  1. select
  2. -- 截取当前b的index的位置开始,第一个出现切分符的内容
  3. substring(a.[columname], b.number, charindex(‘;‘, a.[columname] + ‘;‘, b.number) - b.number) as ans1
  4. FROM TestTable a, 
  5. -- 系统表
  6. master..spt_values b
  7. WHERE 
  8. -- 从0开始的自增正整数
  9. b.type=‘p‘ 
  10. -- 从第一个字符截取到切分符的位置‘;‘,相当于index
  11. and substring(‘;‘ + a.[columname],b.number, 1) = ‘;‘

具体执行顺序大致如下假设当前字符串为‘12;345;6‘

1. b.number = 0  看判断条件  substring(‘;12;345;6‘,0, 1) = null(知识点注解) 不等于 = ‘;‘ 执行下一步b.number+1

2. b.number = 1  看判断条件  substring(‘;12;345;6‘,1, 1) = ‘;‘因此取值

substring(‘12;345;6‘, 1, charindex(‘;‘, ‘12;345;6‘ + ‘;‘, 1) - 1)而

charindex(‘;‘, ‘12;345;6;‘, 1) = 3 所以相当于取

substring(‘12;345;6‘, 1, 2) 因此取出了 12

3. b.number = 2  看判断条件  substring(‘;12;345;6‘,2, 1) = 1 同1

4. b.number = 3  看判断条件  substring(‘;12;345;6‘,3, 1) = 1 同1

4. b.number = 4  看判断条件  substring(‘;12;345;6‘,4, 1) = ‘;‘因此取值

substring(‘12;345;6‘, 4, charindex(‘;‘, ‘12;345;6‘ + ‘;‘, 4) - 4)而

charindex(‘;‘, ‘12;345;6;‘, 4) = 7 所以相当于取

substring(‘12;345;6‘, 4, 3) 因此取出了 345

。。。。

执行上述SQL取出结果

  1. 03
  2. 02
  3. 03
  4. 02
  5. 03
  6. 04
  7. 01
  8. 02
  9. 04
  10. 01
  11. 03
  12. 01
  13. 02
  14. 02
  15. 05
  16. 01
  17. 02
  18. 03
  19. 01
  20. 02
  21. 01
  22. 01
  23. 01
  24. 03
  25. 01
  26. 02
  27. 02

再对此数据结果进行统计

注意点:

SQLSERVER的 [SUBSTRING](expression, start, length) 方法 其中的start位置是从1开始,而不是从0开始;

[SUBSTRING](expression, expression[, start]) 方法 中的start位置也是从1开始,而不是从0开始

这些与C#等语言从0开始索引不同

来自为知笔记(Wiz)

时间: 2024-11-12 14:32:33

利用SQL进行字符串切分统计的相关文章

SQL Server中利用正则表达式替换字符串

原文:SQL Server中利用正则表达式替换字符串 建立正则替换函数,利用了OLE对象,以下是函数代码: --如果存在则删除原有函数 IF OBJECT_ID(N'dbo.RegexReplace') IS NOT NULL DROP FUNCTION dbo.RegexReplace GO --开始创建正则替换函数 CREATE FUNCTION dbo.RegexReplace ( @string VARCHAR(MAX), --被替换的字符串 @pattern VARCHAR(255),

SQL Server-深入剖析统计信息

转自: http://www.cnblogs.com/zhijianliutang/p/4190669.html   概念理解 关于SQL Server中的统计信息,在联机丛书中是这样解释的 查询优化的统计信息是一些对象,这些对象包含与值在表或索引视图的一列或多列中的分布有关的统计信息.查询优化器使用这些统计信息来估计查询结果中的基数或行数.通过这些基数估计,查询优化器可以创建高质量的查询计划.例如,查询优化器可以使用基数估计选择索引查找运算符而不是耗费更多资源的索引扫描运算符,从而提高查询性能

SQL截取字符串

SQL截取字符串 SUBSTRING 返回字符.binary.text      或      image      表达式的一部分.有关可与该函数一起使用的有效      Microsoft®      SQL      Server™      数据类型的更多信息,请参见数据类型. 语法 SUBSTRING      (      expression      ,      start      ,      length      ) 参数 expression 是字符串.二进制字符串.

利用SQL注入漏洞登录后台的实现方法

利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读这篇文章,我假设读者有过写SQL语句的经历,或者能看得懂SQL语句 早在02年,国外关于SQL注入漏洞的技术文章已经很多,而国内在05年左右才开始的.  如今,谈SQL注入漏洞是否已是明日黄花,国内大大小小的网站都已经补上漏洞.但,百密必有一疏,入侵是偶然的,但安全绝对不是必然的.  前些天,网上传

MySQL 直接用SQL分割字符串到数组

承接上文:MySQL  中在不编写存储过程或函数的前提下,利用SQL 语句拆分一个字符串到数组 主要思路其实一致:够造序列,然后结合MySQL的SUBSTRING_INDEX 函数的特性分割字符串. SET @str ="a,b,c,d,e,f,g,h,i,j,k" ; SET @delim="," ; SET @str_length=length(@str)- length( REPLACE (@str,@delim,'') )+1 ; SELECT SUBSTR

利用StringEscapeUtils对字符串进行各种转义与反转义(Java)

利用StringEscapeUtils对字符串进行各种转义与反转义(Java) 分类: java编程思想 Guava-Commons-xml-json等工具类库2015-02-03 20:51 6290人阅读 评论(1) 收藏 举报 StringEscapeUtils用法例StringEscapeUtils使用java中字符串的转义字符串转义工具StringEscapeUtils apache工具包common-lang中有一个很有用的处理字符串的工具类,其中之一就是StringEscapeUt

利用SQL Profiler处理开销较大的查询

原文:利用SQL Profiler处理开销较大的查询 当SQL Server的性能变差时,最可能发生的是以下两件事: 首先,某些查询产生了系统资源上很大的压力.这些查询影响整个系统的性能,因为服务器无法足够快速地服务其他SQL查询. 另外,开销较大的查询阻塞了其他请求相同数据库资源的查询,进一步降低了这些查询的性能.优化开销较大的查询不仅改进它们本身的性能,而且减少数据库阻塞和SQL Server资源压力从而提高了其他查询的性能. 识别开销较大的查询 SQL Server的目标是在最短时间内将结

Sql Sever 字符串截取汉字

最近需要在SQL的字符串中截取汉字,利用unicode函数判断字符的unicode编码,根据编码范围过滤掉非汉字字符. 写成了一个function /*@str 需要获取汉字的字符串*/ create function CharRep(@str nvarchar(200)) returns nvarchar(200) as begin  declare @i int, @char nvarchar(1), @zh nvarchar(200) set @i = 1 set @zh = '' whi

SQL Server中sp_spaceused统计数据使用的空间总量不正确的原因

原文:SQL Server中sp_spaceused统计数据使用的空间总量不正确的原因 很多时候,我们经常使用sp_spaceused来查看表的空间使用情况,上个月群里有个网友说他使用DELETE删除了数据后,使用sp_spaceused查看,发现该表的分配的空间总量(reserved)与数据使用的空间总量(data)没有变化,当时和他讨论了并分析了一下原因,随手记录了一下这个案例,这个周末刚好有点时间,正好分析整理一下这个案例.分享在这篇文章.如下所示,我们先构造数据,我们的测试案例比较极端,