原文:在论坛中出现的比较难的sql问题:27(字符串拆分、字符串合并、非连续数字的间隔范围、随机返回字符串)


在论坛中看到一个帖子,帖子中有一些sql方面的面试题,我觉得这些面试题很有代表性。

原帖的连接为:http://bbs.csdn.net/topics/390884161?page=1#post-398177057

下面是我的解法,供大家参考:

1、分拆字符串


  1. create table test1 (number varchar(100))
  2. insert into test1 values ('1,2,3,4,5,6')
  3. 希望结果:
  4. number
  5. ------
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5
  11. 6
  12. (6 行受影响)

我的解法:


  1. --1.拆分字符串
  2. create table test1 (number varchar(100))
  3. insert into test1 values ('1,2,3,4,5,6')
  4. select --t.number,
  5. SUBSTRING(t.number, s.number ,CHARINDEX(',',t.number+',',s.number)-s.number) as number
  6. from test1 t,master..spt_values s
  7. where s.number >=1
  8. and s.type = 'P'
  9. and SUBSTRING(','+t.number,s.number,1) = ','
  10. /*
  11. number
  12. 1
  13. 2
  14. 3
  15. 4
  16. 5
  17. 6
  18. */

2、非连续数字的范围


  1. create table test2(number int)
  2. insert into test2 values
  3. (1),(2),(3),(4),(5),(7),(8),
  4. (10),(11),(13),(15)
  5. 实现效果
  6. number
  7. ---------------------
  8. 1~5
  9. 7~8
  10. 10~11
  11. 13
  12. 15

我的解法:


  1. --2.非连续数字的间隔
  2. create table test2(number int)
  3. insert into test2 values
  4. (1),(2),(3),(4),(5),(7),(8),
  5. (10),(11),(13),(15)
  6. ;with t
  7. as
  8. (
  9. select *,
  10. row_number() over(order by number) rn
  11. from test2
  12. )
  13. select case when min(number)=max(number) then cast(min(number) as varchar)
  14. else cast(min(number) as varchar)+'~'+cast(max(number) as varchar) end as number
  15. from t
  16. group by number-rn
  17. /*
  18. number
  19. 1~5
  20. 7~8
  21. 10~11
  22. 13
  23. 15
  24. */

3、合并字符串


  1. create table test4 (name varchar(10),mytype varchar(10),cj int )
  2. insert into test4
  3. values('张三','语文',83),
  4. ('张三','数学',65),
  5. ('张三','物理',85),
  6. ('李四','语文',73),
  7. ('李四','数学',69),
  8. ('李四','物理',93)
  9. 实现效果
  10. name mytype cj
  11. 张三 语文,数学,物理 83,65,85
  12. 李四 语文,数学,物理 73,69,93

我的解法:


  1. --3.合并字符串
  2. create table test4 (name varchar(10),mytype varchar(10),cj int )
  3. insert into test4
  4. values('张三','语文',83),
  5. ('张三','数学',65),
  6. ('张三','物理',85),
  7. ('李四','语文',73),
  8. ('李四','数学',69),
  9. ('李四','物理',93)
  10. select name,
  11. stuff((select ','+mytype from test4 t4 where t4.name = test4.name for xml path('')),1,1,'') as mytype,
  12. stuff((select ','+cast(cj as varchar) from test4 t4 where t4.name = test4.name for xml path('')),1,1,'') as cj
  13. from test4
  14. group by name
  15. /*
  16. name mytype cj
  17. 李四 语文,数学,物理 73,69,93
  18. 张三 语文,数学,物理 83,65,85
  19. */

4、写一个函数,输入2个varchar参数@str1,@str2,返回字符串@str1 在@str2中出现的次数,@int.

如(@str2=’abcsaac',@str1='a') 返回3。

我的解法:


  1. --4.串1在串2出现次数
  2. declare @str2 varchar(100)='abcsaac'
  3. declare @str1 varchar(10)='a'
  4. select (len(@str2) - len(replace(@str2,@str1,''))) / len(@str1) as t --这里需要除以字符串1的长度
  5. /*
  6. t
  7. 3
  8. */

5、查询所有表空间的大小,并按照从大到小排序。

我的解法:


  1. --5.返回表的大小,按照从大到小排序
  2. create table tb1
  3. (
  4. name varchar(100),
  5. rows numeric,
  6. reserved varchar(100),
  7. data varchar(100),
  8. index_size varchar(100),
  9. unused varchar(100)
  10. )
  11. exec sp_msforeachtable 'insert into tb1 exec sp_spaceused ''?'''
  12. select *
  13. from tb1
  14. order by cast(replace(reserved,' KB','') as numeric) desc

6、随机返回指定个数的字符

写一个存储过程。输入参数@int,返回随机@int 个字母。如输入5个。返回随机5个字母。

我的解法:


  1. --6.随机返回指定个数的字符
  2. declare @int int
  3. declare @str varchar(1000)
  4. set @int = 5
  5. set @str = ''
  6. select @str = @str + char(ascii('A') + abs(checksum(newid())) % 26)
  7. from master..spt_values
  8. where type='P'
  9. and number between 1 and @int
  10. select @str
  11. /*
  12. EPOZQ
  13. */
发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

在论坛中出现的比较难的sql问题:27(字符串拆分、字符串合并、非连续数字的间隔范围、随机返回字符串)的更多相关文章

  1. 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)

    原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  2. 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

    原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  3. 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...

  4. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  5. 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)

    原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  6. 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  7. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  8. 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)

    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

  9. 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)

    原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  10. 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)

    原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

随机推荐

  1. 多个请求共用一个Servlet(JavaWEB)

    我们在对JavaWEB工程进行开发的时候,我们经常会遇到这样一个问题,在jsp中发送到Servlet的每一个请求都要写一个对应的Servlet,这样会造成一个工程完成下来需要写几十个Servlet,那 ...

  2. Thread.currentThread与this的区别

    在看多线程的时候,看到这个知识点,感觉需要验证一下. 一:线程自启动 1.程序 package com.jun.it.thread; public class MyThread extends Thr ...

  3. 文章后面的QA或FAQ

    QA:question&answer FAQ: Frequently Asked Questions的缩写,中文意思就是“经常问到的问题”

  4. 十一、postman接口测试(安装nodejs和npm)

    cmder安装:https://cmder.net/ node安装:https://nodejs.org/zh-cn/ 打开cmd命令,在命令提示窗输入 npm install -g cnpm --r ...

  5. 提供Web相关的个工具类

    package com.opslab.util.web; import com.opslab.util.ConvertUtil;import com.opslab.util.StringUtil; i ...

  6. Qt编写自定义控件65-光晕日历

    一.前言 操作系统的更新迭代速度非常快,基本上三五年就有个新版本出来,WIN10操作系统还是一个比较成功的系统,据说现在市场份额越来越大,XP的份额已经很小,WIN7的份额也在逐步减少,在最新的WIN ...

  7. 【源码解析】Flink 滑动窗口数据分配到多个窗口

    之前一直用翻滚窗口,每条数据都只属于一个窗口,所有不需要考虑数据需要在多个窗口存的事情. 刚好有个需求,要用到滑动窗口,来翻翻 flink 在滑动窗口中,数据是怎么分配到多个窗口的 一段简单的测试代码 ...

  8. Apache使用内置插件mod_php解析php的配置

    apache安装完毕之后,修改httpd.conf配置文件,添加代码如下: LoadModule php5_module modules/libphp5.so <FilesMatch \.php ...

  9. 0010.Regular Expression Matching(H)

    jjc . Regular Expression Matching(hard) Given an input string (s) and a pattern (p), implement regul ...

  10. ASP.NET MVC路由配置详解

    命名参数规范+匿名对象 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", ...