很有意思的SQL查询题目,看看大家如何解决

来源:百度知道 编辑:UC知道 时间:2024/06/04 03:43:21
这个也是我在一个论坛里看到的,好多人没有找到很好的解决方案。
数据库是SQL Server的

表名 Test 字段ID Str
数据
ID str
1 1,2,4,5,8,9
2 1,3,5,6,7,8,9,11
3 3,4,5,6,7
4 1,5,7,8,9
5 3,5,6,9,11,12
6 2,3,4,5,7
7 3,4,5,6,7,8
8 1,2,3,4,5,6,7,8,9,10
9 1,7,8,9

表里的数据就是类似这样的
现在问题就是 给出一个字符串 1,11,12 (长度不一定,也许是5个也许是6个)
找出含有这个字符串数字的所有数据
比如1,11,12 查询的结果应该是 ID: 1 2 4 5 8 9
含有1 11 12 的数据ID就是 1 2 4 5 8 9

如何用SQL语句实现,可以用程序处理
ID是不用考虑的,ID只是个标示
最大的问题就是charlif 说的 比如1、2、4和11、12、4虽然都是三位数字,但前者只有个位,后者含有十位和个位
如果查询1 有可能连11 12 牵扯进来

需要把逗号作为分割符来考虑,在查询的时候也把逗号加上就可以

这个办法也不错,可以尝试一下

把截出来的数字字符串转换成数值型的呢?
看来都是高手级的人物了

看标准答案,一句解决问题!

SELECT ID FROM TEST A,DBO.MYSPLICT('1,11,12',',') B WHERE ','+A.[STR]+',' LIKE '%,'+B.STRN+',%'

查出的字串换成数值型
SELECT ID,cast(strn as int) strn FROM TEST A,DBO.MYSPLICT('1,11,12',',') B WHERE ','+A.[STR]+',' LIKE '%,'+B.STRN+',%'

这个问题一定是什么考题,用来考你的表值函数的运用。

所以要建立一个我们会经常用到的返回表值的函数。
即:将按某分隔符分隔的格式字串拆分开(解码),然后每一子串成为返回的表中的一个记录,就是下面的函数,建议收入自已的自定义函数收藏,以方便调用:

CREATE FUNCTION MYSPLICT
(@str nvarchar(2000),--要分割的字符串
@Deli varchar(1))--分隔符
RETURNS @table table(strn varchar(30))--反回一个子串表
AS
BEGIN
while charindex(@deli,@str)>0
begin
insert into @table select left(@str,charindex(@deli,@str)-1)
set @str=substring(@str,charindex(@deli,@str)+1,len(@str))
end
if len(@str)>0
insert into @table select @str
return
END
GO

DECLARE @S