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

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

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

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

1、分拆字符串

create table test1 (number varchar(100))
insert into test1 values ('1,2,3,4,5,6')

希望结果:

number
------
1
2
3
4
5
6

(6 行受影响)

我的解法:

--1.拆分字符串
create table test1 (number varchar(100))
insert into test1 values ('1,2,3,4,5,6')

select --t.number,
       SUBSTRING(t.number, s.number ,CHARINDEX(',',t.number+',',s.number)-s.number) as number
from test1 t,master..spt_values s
where s.number >=1
and s.type = 'P'
and SUBSTRING(','+t.number,s.number,1) = ','
/*
number
1
2
3
4
5
6
*/

2、非连续数字的范围

create table test2(number int)
insert into test2 values
(1),(2),(3),(4),(5),(7),(8),
(10),(11),(13),(15)

实现效果
number
---------------------
1~5
7~8
10~11
13
15

我的解法:

--2.非连续数字的间隔
create table test2(number int)
insert into test2 values
(1),(2),(3),(4),(5),(7),(8),
(10),(11),(13),(15)

;with t
as
(
select *,
       row_number() over(order by number) rn
from test2
)

select case when min(number)=max(number) then cast(min(number) as varchar)
            else cast(min(number) as varchar)+'~'+cast(max(number) as varchar) end as number
from t
group by number-rn
/*
number
1~5
7~8
10~11
13
15
*/

3、合并字符串

create table test4 (name varchar(10),mytype varchar(10),cj int )

insert into test4
values('张三','语文',83),
('张三','数学',65),
('张三','物理',85),
('李四','语文',73),
('李四','数学',69),
('李四','物理',93)

实现效果
name	mytype	            cj
张三	语文,数学,物理	83,65,85
李四	语文,数学,物理	73,69,93

我的解法:

--3.合并字符串
create table test4 (name varchar(10),mytype varchar(10),cj int )

insert into test4
values('张三','语文',83),
('张三','数学',65),
('张三','物理',85),
('李四','语文',73),
('李四','数学',69),
('李四','物理',93)

select name,
       stuff((select ','+mytype from test4 t4 where t4.name = test4.name for xml path('')),1,1,'') as mytype,
	   stuff((select ','+cast(cj as varchar) from test4 t4 where t4.name = test4.name for xml path('')),1,1,'') as cj
from test4
group by name
/*
name	mytype	cj
李四	语文,数学,物理	73,69,93
张三	语文,数学,物理	83,65,85
*/

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

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

我的解法:

--4.串1在串2出现次数
declare @str2 varchar(100)='abcsaac'
declare @str1 varchar(10)='a'

select (len(@str2) - len(replace(@str2,@str1,''))) / len(@str1) as t  --这里需要除以字符串1的长度
/*
t
3
*/

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

我的解法:

--5.返回表的大小,按照从大到小排序
create table tb1
(
name varchar(100),
rows numeric,
reserved varchar(100),
data varchar(100),
index_size varchar(100),
unused varchar(100)
)

exec sp_msforeachtable 'insert into tb1 exec sp_spaceused ''?'''

select *
from tb1
order by cast(replace(reserved,' KB','') as numeric) desc 

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

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

我的解法:

--6.随机返回指定个数的字符
declare @int int
declare @str varchar(1000)

set @int = 5
set @str = ''

select @str = @str + char(ascii('A') + abs(checksum(newid())) % 26)
from master..spt_values
where type='P'
and number between 1 and @int

select @str
/*
EPOZQ
*/
时间: 2025-01-02 21:47:27

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

在论坛中出现的比较难的sql问题:1(字符串分拆+行转列问题 SQL遍历截取字符串)

原文:在论坛中出现的比较难的sql问题:1(字符串分拆+行转列问题 SQL遍历截取字符串) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 求SQL遍历截取字符串 http://bbs.csdn.net/topics/390648078 从数据库中读取某一张表(数据若干),然后将某一字段进行截取.比如:字段A    字段Ba/a/c      xa/b

论坛中不同类型的贴的排序问题(涉及数据库的:CASE... END)

在论坛中,会有不同类型的帖子,比如说:普通贴.精华帖.置顶帖: 论坛的这些贴子会根据不同的类型进行排序,当然不仅仅只是看帖子类型,还有贴子的动态情况来进行排序. 在这里演示一下简单的帖子排序,我们只关注帖子的最新动态时间和帖子类型进行排序. 其中最新动态的时间是这样确定的:如果刚创建的新帖,那么该帖子的最新动态时间就为该帖子的创建时间:如果有最新的回复,那么最新的动态时间就为最新回复的时间: 排序条件: 1. 最新动态时间越新越靠前 2. 普通贴跟精华贴之间在排序上没有区别,置顶帖肯定是最顶层的

Docker官方论坛中回复最多的一个帖子“在数据容器内升级数据”

Docker官方论坛中回复最多的一个帖子"在数据容器内升级数据" matlehmann我有一个含数据的容器,它有一个卷(比如在/var/data)中的持久性数据.该容器包含持久性数据对另一个容器的软件.对于该软件的新版本,需要升级所述永久数据(结构或布局改变等).其结果是,我想与在相同的位置已升级的数据的另一数据容器(在/var/data)和仍保留旧数据容器与它的数据不变.这样一来,我可以用旧的数据容器与旧版本的软件,万一出了差错.但是,我怎么能做到这一点?以实现所期望的结果所需要的步

(18)Powershell中的字符串拆分运算符

Powershell中提供了对字符串的拆分操作运算符.-split 运算符将一个字符串拆分成多个字符串. 拆分运算符 拆分运算符用于将一个或多个字符串拆分为多个子字符串.可更改拆分操作的以下元素: (1)定界符.默认为空白,但是可指定字符.字符串.模式或用于设置定界符的脚本块. (2)子字符串的最大数目.默认设置为返回所有子字符串.如果指定的数字小于子字符串数,则其余子字符串将合并到最后一个子字符串中. (3)用于指定定界符匹配条件的选项,如 SimpleMatch 和 Multiline. 拆

hdu 1066 Last non-zero Digit in N! (数论——n!中的最后一个非0数字)

Last non-zero Digit in N! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6432    Accepted Submission(s): 1593 Problem Description The expression N!, read as "N factorial," denotes the pro

阿里RAP+fiddler实现app原生应用的cgi数据mock----- (二)添加mock规则,随机返回4中类型(不同长度)的数据

##RAP如何生成json数据## 1.页面添加mock规则:直接入库: 2.服务从db中获取对应的规则串,调用mock-min.js解析,生成数据返回给服务: MockjsRunner.doRenderMockJsRule调用context.evaluateString直接执行mock-min.js,返回对应生成的结果:3.服务讲回调函数的结果返回给前端:##RAP如何添加规则##mock-min.js中对Random.extend进行扩展: Random.extend({ /*随机返回一个随

Linux系统中数据库启动和关闭&Basic SQL

第一步:使用oracle用户登录 第二步:在oracle用户下输入sqlplus /nolog 第三步:如需使用管理员权限,则输入connect /as sysdba 第四步:启动和关闭 startup startup nomount #只启动实例 startup mount   #打开控制文件 startup open    #打开数据文件和重做日志 shutdown shutdown normal        #不接受新的连接,需要等待所有的用户断开连接 shutdown immediat

hibernate4中oracle,sqlserver,mysql数据库的sql方言配置(SQL Dialects)

hibernate4中oracle,mysql,sqlserver数据库的sql方言配置(SQL Dialects) 数据库类型 Hibernate sql方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect DB2 OS390 org.hibernate.dialect.DB2390Dialect PostgreSQL 8.1 org.hibernate.dialect.Po

求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。函数为 int same(int num)其中num是输入的整型数字

import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Test { public static void main(String[] args) { /** * 2.求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123, * 相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0. * 方法是先将整型数字转换到数组中,再判断.