求一sql 计算某个段的值 60wwfgu00ing]

发布时间:2016-12-6 22:17:17 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"求一sql 计算某个段的值 60wwfgu00ing]",主要涉及到求一sql 计算某个段的值 60wwfgu00ing]方面的内容,对于求一sql 计算某个段的值 60wwfgu00ing]感兴趣的同学可以参考一下。

表数据如下 ID   GradeRange 1    0,999 2    1000,9999 3    10000,99999 4    100000,-1 其中-1代表无穷大 现求已解决方案 存储过程 函数。。不限 使得一个数值丢进去 ,判断是否在根据GradeRange最小值和最大值之间,从而计算相应的ID 比如  555  555>0  555<999   那么该ID 是1

If object_id('tb') is not null      Drop table tb Go Create table tb(ID int,GradeRange varchar(20)) Go Insert into tb select 1,'0,999' union all select 2,'1000,9999' union all select 3,'10000,99999' union all select 4,'100000,-1'  Go declare @i int set @i=100009 Select * from tb where @i>=cast(left(graderange,charindex(',',graderange)-1) as int) and @i<=case when stuff(graderange,1,charindex(',',graderange),'')='-1' then @i+1  else cast(stuff(graderange,1,charindex(',',graderange),'') as int) end /* ID          GradeRange            ----------- --------------------  4           100000,-1 (所影响的行数为 1 行) */

declare @table table (ID int,GradeRange varchar(20)) insert into @table select 1,'0,999' union all select 2,'1000,9999' union all select 3,'10000,99999' union all select 4,'100000,-1' declare @i int;set @i=2500 --25000  --25000 select ID from @table where @i+1>=left(GradeRange,charindex(',',GradeRange)-1)+1 and @i+1<=right(GradeRange,len(GradeRange)-charindex(',',GradeRange))+1 union all select top 1 4 from @table where @i>100001

建议表改成3个字段的,把后面两个上下限,分成2个字段,会容易控制很多。

引用 3 楼 maco_wang 的回复:建议表改成3个字段的,把后面两个上下限,分成2个字段,会容易控制很多。是的

declare @i set @i=555 select id    from T   where @i between  cast(substring(GradeRange,1,(CHARINDEX(',', GradeRange)) as integer) and  cast(substring(GradeRange,CHARINDEX(',', GradeRange)+1 , len(GradeRange)) as integer)

直接设置三个列,id,小数,大数,不就很简单了么! 还有个办法: declare @i int set @i=2542 select (sign(@i/1000-1)+sign(@i/10000-1)+sign(@i/100000-1)+3)/2+1 /* ----------- 2 (1 行受影响) */

declare @i int set @i=254 select (sign(@i/1000-1)+sign(@i/10000-1)+sign(@i/100000-1)+3)/2+1 /* ----------- 1 (1 行受影响) */ set @i=2543 select (sign(@i/1000-1)+sign(@i/10000-1)+sign(@i/100000-1)+3)/2+1 /* ----------- 2 (1 行受影响) */ set @i=25444 select (sign(@i/1000-1)+sign(@i/10000-1)+sign(@i/100000-1)+3)/2+1 /* ----------- 3 (1 行受影响) */ set @i=254444455 select (sign(@i/1000-1)+sign(@i/10000-1)+sign(@i/100000-1)+3)/2+1 /* ----------- 4 (1 行受影响) */ 哈哈................... 我太有才了!

不得不说你的思路很新颖,同时学到了SIGN,以前没用到过,所以不了解。 引用 8 楼 qianjin036a 的回复:SQL code declare @i int set @i=254 select (sign(@i/1000-1)+sign(@i/10000-1)+sign(@i/100000-1)+3)/2+1 /* ----------- 1 (1 行受影响) */ set @i=2543 select (sign(@i/1000-1)+sign(@i/10000-1)+sign(@i/10000……

刚才用你的表达式测试了一下,发现当值等于1000时,得出的结果是1,与要求不符,所以做出了如下的改正, 而且这个更直观: declare @i int; set @i=999999; print (sign(@i-999)+sign(@i-9999)+sign(@i-99999)+3)/2+1

上一篇:有关一条查询语句 40z184931481]
下一篇:有关数据递增的问题 40z184931481]

相关文章

相关评论