SQL数值倍率实现问题....

在以前的项目中遇到这么一个应用
按不同的数值来获取不同的倍率,然后再重得出一个值
为了定义方便我在程序中让用户自己定义一串倍率如下面的:
1.5:<=2.8;1.4:<=5.6;1.4:>2.8;1.3:<=8.4;1.3:>5.6;1.2:<=11.2;1.2:>8.4;1.1:<=16.8;1.1:>11.2;1.05:<=22.4;1.05:>16.8


说明一下其中的组成方式
  1.5:<=2.8;
 当数值大于等于2.8时则返回1.5的倍率
  格式:<倍率>:<比较符><比较值>;
                用分号来做倍率设置分隔符

我是用SQL函数来实现的,但这个函数有很大的问题,还要改进,
在这函数中我先定义一张临时表,然后将倍率设置串转为数据表,
然后再在这张表中查找最匹配的倍率,但有对比较符有一个优先级
不知道大家做过类似的东西,给点建意:-)

None.gif create    function  GetRate( @tmpTestRate   nvarchar ( 2000 ), @tmpValue   float )
None.gif
returns   float
None.gif
as
None.gif
begin
None.gif
None.gif
--  set nocount on 
None.gif--
 declare @tmpTestRate nvarchar(2000)
None.gif--
 declare @tmpValue float
None.gif--
 set @tmpTestRate='1.5:<=2.8;1.4:<=5.6;1.4:>2.8;1.3:<=8.4;1.3:>5.6;1.2:<=11.2;1.2:>8.4;1.1:<=16.8;1.1:>11.2;1.05:<=22.4;1.05:>16.8'
None.gif--
 set @tmpValue=12
None.gif

None.gif
declare   @rtlRate   float
None.gif
declare   @tmpStr2   nvarchar ( 2000 )
None.gif
declare   @r   table  (sql  nvarchar ( 2000 ),rate  float ,scale  float ,cmp  nvarchar ( 50 ))
None.gif
declare   @tmpChar   nvarchar ( 3 )
None.gif
declare   @tmpStr   nvarchar ( 2000 )
None.gif
declare   @rate   float
None.gif
declare   @scale   float
None.gif
declare   @i   int
None.gif
declare   @l   int
None.gif
declare   @ex   bit
None.gif
select   @i = 0 , @l = 0 , @tmpStr2 = '' , @scale = 0 , @tmpStr = ''
None.gif
set   @tmpTestRate = ' ; ' + REPLACE ( @tmpTestRate , ' : ' , '  WHERE iPrcieX ' ) + ' ; '
None.gif
set   @tmpTestRate = REPLACE ( @tmpTestRate , ' ; ' , ' | iWage=iPrice* ' )
None.gif
set   @i = 1
None.gif
set   @tmpTestRate = right ( @tmpTestRate , len ( @tmpTestRate ) - 1 )
None.gif
while   len ( @tmpTestRate ) <> @i
None.gif
begin
None.gif  
set   @tmpChar = substring ( @tmpTestRate , @i , 1 )
None.gif  
if   @tmpChar = ' | '   and   len ( @tmpStr ) > 1
None.gif  
begin
None.gif    
select   @ex = 0 , @l = len ( @tmpStr )
None.gif    
while   @ex = 0   and   @l > 0
None.gif    
begin
None.gif      
set   @tmpChar = substring ( @tmpStr , @l , 1 )
None.gif      
if   charindex ( @tmpChar , ' ~>=< ' ) <> 0
None.gif      
begin
None.gif
--        print @tmpStr
None.gif
         select  
None.gif           
@ex = 1 ,
None.gif           
@scale = cast (
None.gif                    
substring (
None.gif                      
substring (
None.gif                        
rtrim ( ltrim ( @tmpStr )),
None.gif                        
1 ,
None.gif                        
charindex ( '   ' , rtrim ( ltrim ( @tmpStr ))) - 1
None.gif                      ),
None.gif                      
charindex ( ' * ' , rtrim ( ltrim ( @tmpStr ))) + 1 ,
None.gif                      
len ( @tmpStr )
None.gif                    ) 
as   float
None.gif                  ),
None.gif           
@rate = cast ( @tmpStr2   as   float ),
None.gif           
@tmpStr2 = ''
None.gif           
None.gif      
end
None.gif      
else
None.gif        
select   @tmpStr2 = @tmpChar + @tmpStr2
None.gif      
set   @l = @l - 1
None.gif    
end
None.gif    
insert   into   @r  (sql,rate,scale,cmp)  values  ( @tmpStr , @rate , @scale , substring ( replace ( @tmpStr , @rate , '' ), charindex ( ' X ' , @tmpStr ) + 1 , len ( @tmpStr )))  
None.gif    
set   @tmpStr = ''
None.gif  
end
None.gif  
else
None.gif    
set   @tmpStr = @tmpStr + @tmpChar
None.gif  
set   @i = @i + 1
None.gif
end
None.gif
set   @rtlRate = 0
None.gif
select   top   1   @rtlRate = isnull (scale, 0 ), @i = isnull (rate, 0 from   @r   where   @tmpValue = rate  and  cmp = ' = '   order   by  rate
None.gif
if   @rtlRate = 0
None.gif  
select   top   1   @rtlRate = isnull (scale, 0 ), @i = isnull (rate, 0 from   @r    where   @tmpValue >= rate  and  cmp = ' >= '   order   by  rate
None.gif
if   @rtlRate = 0
None.gif  
select   top   1   @rtlRate = isnull (scale, 0 ), @i = isnull (rate, 0 from   @r    where   @tmpValue > rate  and  cmp = ' > '   order   by  rate
None.gif
if   @rtlRate = 0
None.gif  
select   top   1   @rtlRate = isnull (scale, 0 ), @i = isnull (rate, 0 from   @r    where   @tmpValue <= rate  and  cmp = ' <= '   order   by  rate
None.gif
if   @rtlRate = 0
None.gif  
select   top   1   @rtlRate = isnull (scale, 0 ), @i = isnull (rate, 0 from   @r    where   @tmpValue < rate  and  cmp = ' < '   order   by  rate
None.gif
None.gif
None.gif
--  print @rtlRate
None.gif--
 set nocount off
None.gif

None.gif
return   @rtlRate
None.gif
end

转载于:https://www.cnblogs.com/pvistely/archive/2005/05/27/163534.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值