急急急!连续的自然数查询,请修正语句!

RICHEER COCA 2016-09-13 11:36:35


--> 建立数据表#test1 --数据表#test1里有'unotext'字段记录(一共有1178009行数据,每一行的数据都是基因信息数据)

if object_id('tempdb.dbo.#test1') is not null drop table #test1
go
create table #test1([personid] int,[unotext] nvarchar(20))
insert #test1
select 100001,'04005013022025028' union all
select 100002,'04005013022025030'

-->查询基因信息第2、5、8、11、14、17位的数是连续的自然数,例如“1,2”或者“1,2,3”或者“4,5”或者“4,5,6”或者“4,5,6,7”或者“1,2,3,4,5,6”以此类推

SELECT personid, unotext
FROM #test1
where 1=1
and Cast(SUBSTRING(unotext,2,1) as int )+Cast(SUBSTRING(unotext,8,1) as int )=2*Cast(SUBSTRING(unotext,5,1) as int )
or Cast(SUBSTRING(unotext,5,1) as int )+Cast(SUBSTRING(unotext,11,1) as int )=2*Cast(SUBSTRING(unotext,8,1) as int )
or Cast(SUBSTRING(unotext,8,1) as int )+Cast(SUBSTRING(unotext,14,1) as int )=2*Cast(SUBSTRING(unotext,11,1) as int )
or Cast(SUBSTRING(unotext,11,1) as int )+Cast(SUBSTRING(unotext,17,1) as int )=2*Cast(SUBSTRING(unotext,14,1) as int )

order by personid

-->执行结果

/*
personid unotext
100001 04005013022025028
*/

-->问题:执行语句错在哪里?执行要求:查询第2、5、8、11、14、17位的数是连续的自然数(2位或2位以上连续)的基因信息


/*想要的结果*/

/*
personid unotext
100001 04005013022025028
100002 04005013022025030
*/


问题:执行语句错在哪里?执行要求:查询第2、5、8、11、14、17位的数是连续的自然数(2位或2位以上连续)的基因信息
...全文
188 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
RICHEER COCA 2016-09-13
  • 打赏
  • 举报
回复
笨拙的方法
--> 建立数据表#test1 --数据表#test1里有'unotext'字段记录(一共有1178009行数据,每一行的数据都是基因信息数据)

if object_id('tempdb.dbo.#test1') is not null drop table #test1
go 
create table #test1([personid] int,[unotext] nvarchar(20))
insert #test1
select 100001,'04005013022025028' union all
select 100002,'04005013022025030' union all
select 100002,'24027029030031032'

-->查询基因信息第2、5、8、11、14、17位的数是连续的自然数,例如“0,1”或者“1,2,3”或者“4,5”或者“4,5,6”或者“4,5,6,7”或者“1,2,3,4,5,6”以此类推

SELECT  personid, unotext
FROM #test1
where 1=1
AND cast([unotext] as varchar(20)) like '%01002%'
OR cast([unotext] as varchar(20)) like '%01002003%'
OR cast([unotext] as varchar(20)) like '%01002003004%'
OR cast([unotext] as varchar(20)) like '%01002003004005%'
OR cast([unotext] as varchar(20)) like '%01002003004005006%'
OR cast([unotext] as varchar(20)) like '%02003%'
OR cast([unotext] as varchar(20)) like '%02003004%'
OR cast([unotext] as varchar(20)) like '%02003004005%'
OR cast([unotext] as varchar(20)) like '%02003004005006%'
OR cast([unotext] as varchar(20)) like '%03004%'
OR cast([unotext] as varchar(20)) like '%03004005%'
OR cast([unotext] as varchar(20)) like '%03004005006%'
OR cast([unotext] as varchar(20)) like '%04005%'
OR cast([unotext] as varchar(20)) like '%04005006%'
OR cast([unotext] as varchar(20)) like '%05006%'
OR cast([unotext] as varchar(20)) like '%10011%'
OR cast([unotext] as varchar(20)) like '%10011012%'
OR cast([unotext] as varchar(20)) like '%10011012013%'
OR cast([unotext] as varchar(20)) like '%10011012013014%'
OR cast([unotext] as varchar(20)) like '%10011012013014015%'
OR cast([unotext] as varchar(20)) like '%20021%'
OR cast([unotext] as varchar(20)) like '%20021022%'
OR cast([unotext] as varchar(20)) like '%20021022023%'
OR cast([unotext] as varchar(20)) like '%20021022023 24%'
OR cast([unotext] as varchar(20)) like '%20021022023 24 25%'
OR cast([unotext] as varchar(20)) like '%30031%'
OR cast([unotext] as varchar(20)) like '%30031032%'
OR cast([unotext] as varchar(20)) like '%30031032033%'


/*结果*/

/*
personid	unotext
100001	04005013022025028
100002	04005013022025030
100003	24027029030031032
*/

问题:LZ水平菜鸟级,笨拙!!!有更加简短的SQL语句吗?求解,期盼中......
RICHEER COCA 2016-09-13
  • 打赏
  • 举报
回复
订正: 问题:执行语句错在哪里?执行要求:查询第2、5、8、11、14、17位的数是连续的正整数(2位或2位以上连续)的基因信息
RICHEER COCA 2016-09-13
  • 打赏
  • 举报
回复
谢谢3#和8#,受益匪浅,都值得LZ学习
中国风 2016-09-13
  • 打赏
  • 举报
回复
你用#8应该满足你的情况,只要有两个连续相邻的成立
RICHEER COCA 2016-09-13
  • 打赏
  • 举报
回复
引用 7 楼 roy_88 的回复:
132--这样的条件成不成立 ? 如:成立用上面方法就行
132不成立,123成立,0123成立,9012成立,7890成立 取第2、5、8、11、14、17 这6位数字有连续的记录数 连续的规则是 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0 举例,第n位是9,那么第n+1位就是0,第n+2位是1,以此类推。
RICHEER COCA 2016-09-13
  • 打赏
  • 举报
回复
取第2、5、8、11、14、17 这6位数字有连续的记录数 连续的规则是 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0 举例,第n位是9,那么第n+1位就是0,第n+2位是1,以此类推。 2 3 4 1 5 0 6 9 8 7
shoppo0505 2016-09-13
  • 打赏
  • 举报
回复
with tb (personid, unotext) as ( select 100001,'04005013022025028' union all select 100002,'04005013022025030' union all select 100002,'03005013022025030' ) select * from tb where ((Cast(SUBSTRING(unotext,2,1) as int ) + 1) % 10 = Cast(SUBSTRING(unotext,5,1) as int)) OR ((Cast(SUBSTRING(unotext,5,1) as int) + 1) % 10 = Cast(SUBSTRING(unotext,8,1) as int)) OR ((Cast(SUBSTRING(unotext,8,1) as int) + 1) % 10 = Cast(SUBSTRING(unotext,11,1) as int)) OR ((Cast(SUBSTRING(unotext,11,1) as int) + 1) % 10 = Cast(SUBSTRING(unotext,14,1) as int)) OR ((Cast(SUBSTRING(unotext,14,1) as int) + 1) % 10 = Cast(SUBSTRING(unotext,17,1) as int))
中国风 2016-09-13
  • 打赏
  • 举报
回复
132--这样的条件成不成立 ? 如:成立用上面方法就行
RICHEER COCA 2016-09-13
  • 打赏
  • 举报
回复
引用 5 楼 roy_88 的回复:
以上不是排序,是取这6位数字有连续的记录数
非常正确,道出了我的心声,赞赞赞 -->查询基因信息 --第2、5、8、11、14、17位的数只能是0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9从小到大排序。举例,第n位是9,那么第n+1位就是0,第n+2位是1,以此类推。 --第2、5、8、11、14、17位的数是连续的自然数,例如是“1,2”或者“1,2,3”或者“4,5”或者“4,5,6”或者“4,5,6,7”或者“1,2,3,4,5,6”以此类推,就符合查询条件。 --PS:不是取第2、5、8、11、14、17位的数进行排序,而是查询第2、5、8、11、14、17位的数是否符合0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9从小到大的连续的自然数排序。 取第2、5、8、11、14、17 这6位数字有连续的记录数
中国风 2016-09-13
  • 打赏
  • 举报
回复
以上不是排序,是取这6位数字有连续的记录数
RICHEER COCA 2016-09-13
  • 打赏
  • 举报
回复
引用 3 楼 roy_88 的回复:
[/code]
非常感谢 3 楼 roy_88 大师的指教,但不是我需要的结果,抱歉!是我没有表述清楚,现进一步说明 第2、5、8、11、14、17位的数只能是0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9从小到大排序。举例,9的下一位是0,0下一位是2,以此类推。

--> 建立数据表#test1 --数据表#test1里有'unotext'字段记录(一共有1178009行数据,每一行的数据都是基因信息数据)
 
if object_id('tempdb.dbo.#test1') is not null drop table #test1
go 
create table #test1([personid] int,[unotext] nvarchar(20))
insert #test1
select 100001,'01005013022027028' union all ---第2、5、8、11、14、17位的数分别是1/5/3/2/7/8,第14、17位分别为7/8,符合查询条件,有结果。

select 100002,'04005013022025030' union all ---第2、5、8、11、14、17位的数分别是4/5/3/2/5/0,第2、5位分别为4/5,符合查询条件,有结果。

select 100002,'06005013022024031' union all ---第2、5、8、11、14、17位的数分别是6/5/3/2/4/1,没有从小到大的自然数,不符合查询条件,没有结果。

select 100002,'24027029030031032'            ---第2、5、8、11、14、17位的数分别是4/7/9/0/1/2,第8、11、14、17位分别为9/0/1/2,符合查询条件,有结果。
PS:不是取第2、5、8、11、14、17位的数进行排序,而是查询第2、5、8、11、14、17位的数是否符合0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9从小到大排序。 恳请指教,学习中。。。。。
中国风 2016-09-13
  • 打赏
  • 举报
回复
用以下语句测测,是不是这样效果连续的自然数>=2以上


--> 建立数据表#test1 --数据表#test1里有'unotext'字段记录(一共有1178009行数据,每一行的数据都是基因信息数据)

if object_id('tempdb.dbo.#test1') is not null drop table #test1
go 
create table #test1([personid] int,[unotext] nvarchar(20))
insert #test1
select 100001,'04005013022025028' union all
select 100002,'04005013022025030' 

-->查询基因信息第2、5、8、11、14、17位的数是连续的自然数,例如“1,2”或者“1,2,3”或者“4,5”或者“4,5,6”或者“4,5,6,7”或者“1,2,3,4,5,6”以此类推

SELECT  personid, unotext,b.*
FROM #test1 AS a
	CROSS APPLY(
	SELECT COUNT(*)-count(DISTINCT Grp)
	FROM (
	SELECT Num1-ROW_NUMBER()OVER(ORDER BY b1.Num1) AS Grp 
	FROM
	(SELECT SUBSTRING(unotext,2,1)*1 AS Num1
	UNION ALL SELECT SUBSTRING(unotext,5,1) AS Num2
	UNION ALL SELECT SUBSTRING(unotext,8,1) AS Num3
	UNION ALL SELECT SUBSTRING(unotext,11,1) AS Num4
	UNION ALL SELECT SUBSTRING(unotext,15,1) AS Num5
	UNION ALL SELECT SUBSTRING(unotext,17,1) AS Num6) AS b1
	)b2
	)b(con)
WHERE b.con>=2--连续自然数>=2
order by personid

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧