Separating elements

Separating elements is a classic T-SQL challenge. It involves a table called Arrays with strings holding comma-separated lists of values in a column called arr.

Run the following code to create the Arrays table, and populate it with sample data:

  1. SET NOCOUNT ON;
  2.  
  3. USE tempdb;
  4.  
  5. IF OBJECT_ID(N'dbo.Arrays', N'U') IS NOT NULL
  6. DROP TABLE dbo.Arrays;
  7.  
  8. CREATE TABLE dbo.Arrays (
  9. id VARCHAR(10) NOT NULL PRIMARY KEY
  10. , arr VARCHAR(8000) NOT NULL
  11. );GO
  12.  
  13. INSERT INTO dbo.Arrays
  14. VALUES (
  15. 'A'
  16. ,'20,223,2544,25567,14'
  17. );
  18.  
  19. INSERT INTO dbo.Arrays
  20. VALUES (
  21. 'B'
  22. ,'30,-23433,28'
  23. );
  24.  
  25. INSERT INTO dbo.Arrays
  26. VALUES (
  27. 'C'
  28. ,'12,10,8099,12,1200,13,12,14,10,9'
  29. );
  30.  
  31. INSERT INTO dbo.Arrays
  32. VALUES (
  33. 'D'
  34. ,'-4,-6,-45678,-2'
  35. );

The challenge, therefore, is to find an efficient set-based solution using T-SQL. To implement such a solution, you will want to split the task into three steps:

1. Generate copies.
2. Extract an element.
3. Calculate the position.

Generate copies

  1. SELECT id
  2. ,arr
  3. ,n
  4. FROM dbo.Arrays
  5. INNER JOIN AdventureWorks2014.dbo.Nums
  6. ON n <= LEN(arr) AND SUBSTRING(N','+arr, n, 1) = ',';

This code generates the following output:

Extract an element

  1. SUBSTRING(arr, n, CHARINDEX(',', arr + ',', n) n).

Calculate the position

  1. SELECT
  2. id
  3. ,ROW_NUMBER() OVER ( PARTITION BY id ORDER BY n) AS pos
  4. ,SUBSTRING(arr, n, CHARINDEX(',', arr + ',', n) - n) AS element
  5. FROM dbo.Arrays
  6. INNER JOIN AdventureWorks2014.dbo.Nums
  7. ON n <= LEN(arr) + 1 AND SUBSTRING(',' + arr, n, 1) = ',';

T-SQL Recipes之Separating elements的更多相关文章

  1. (转) [it-ebooks]电子书列表

    [it-ebooks]电子书列表   [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...

  2. #定位系统性能瓶颈# strace &amp; ltrace

    strace和ltrace分别相应的是系统调用和库函数调用, 系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思,面向的是硬件. 而库函数调用则面向的是应用开发的.相当于 ...

  3. 10gocm-&gt;session5-&gt;数据库管理实验

    Oracle数据库管理实验 一 传输表空间 二 创建分区表和分区索引 三 FGA细粒度审计 四 监控索引使用情况 五 创建含特殊字段类型的表 六 Flashback闪回技术 一 传输表空间,将ocmd ...

  4. 20145311王亦徐 《网络对抗技术》 Web安全基础实践

    2014531王亦徐 <网络对抗技术> Web安全基础实践 实验内容 利用WebGoat平台尝试了一些XSS.CSRF.SQL注入攻击 基础问题回答 1.SQL注入攻击原理,如何防御原理: ...

  5. linux神器 strace解析

    除了人格以外,人最大的损失,莫过于失掉自信心了. 前言 strace可以说是神器一般的存在了,对于研究代码调用,内核级调用.系统级调用有非常重要的作用.打算了一周了,只有原文,一直没有梳理,拖延症犯了 ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (12) -----第三章 查询之使用SQL语句

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-2使用原生SQL语句更新 问题 你想在实体框架中使用原生的SQL语句,来更新底层 ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (13) -----第三章 查询之使用Entity SQL

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-4使用实体SQL查询模型 问题 你想通过执行Entity SQL语句来查询你的实 ...

  8. ibatis动态sql配置启动时提示:The content of elements must consist of well-formed character data...

    ibatis动态sql配置启动时提示:The content of elements must consist of well-formed character data... 2012-07-18 ...

  9. 【翻译】Flink Table Api & SQL —— 连接到外部系统

    本文翻译自官网:Connect to External Systems  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev ...

随机推荐

  1. WinForm各种API---时时更新

    好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3       0 0     本文原文地址:http://www.cnblogs.com/hqxc/p/6160685.html 徐淳 [D ...

  2. vmware 安装dos注意

    vmware创建ms-dos虚拟机,安状DOS71.ISO. 新创建的机器,启动次序为Removable Devices/Hard Device/CD-ROM Device 新建的机器,第一次启动时, ...

  3. 【bb平台刷课记】wireshark结合实例学抓包

    [bb平台刷课记]wireshark结合实例学抓包 背景:本校形势与政策课程课需要在网上观看视频的方式来修得学分,视频网页自带"播放器不可快进+离开窗口自动暂停+看完一集解锁下一集(即不能同 ...

  4. LocalDB 静默安装

    cmd命令:msiexec /i SqlLocalDB.msi /qn IACCEPTSQLLOCALDBLICENSETERMS=YES 注意:需要以管理员身份运行

  5. 【Django】--Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 例子: 1.创建Form类 from djan ...

  6. php性能剖析的几款软件

    1. xhprof (http://pecl.php.net/package/xhprof)   facebook  2009年开源 2. xdebug 3. valgrind 4. cachegri ...

  7. 素数的平方阶群必为Abel群

    定理  设$p$为素数,则$p^2$阶群$G$必为Abel群.

  8. 配置ntp服务

    配置ntp服务(hadoop搭建可参考) 一:修改选定的服务器的本地时间 date -s '2016-10-07 16:29:30' +'%F %T' //需要设置的时间 二:修改后将时间写入到硬件时 ...

  9. 了解一下OOP的反射API

    PHP5的类和对象函数并没有告诉我们类内部的所有一切,而只是报告了它们的公共成员.要充分了解一个类,需要知道其私有成员和保护成员,还要知道其方法所期望的参数 .对此,使用反射API. 1 查看自定义类 ...

  10. python爬虫成长之路(二):抓取代理IP并多线程验证

    上回说到,突破反爬虫限制的方法之一就是多用几个代理IP,但前提是我们得拥有有效的代理IP,下面我们来介绍抓取代理IP并多线程快速验证其有效性的过程. 一.抓取代理IP 提供免费代理IP的网站还挺多的, ...