SQL用临时表加while遍历行实现有条件的自增长 另case when的两种写法

近日处理客户的逻辑时需要一个有条件的自增长字段

比如表A中有两个字段a,b,现在需要对符合条件的记录,对a进行计数,并存在a中。

a      b
0      y
0      n
0      n
0      y

更改后需要达到的效果
a      b
1      y
0      n
0      n
2      y

当然,可以用游标实现,也许游标的效率比我下边的写法效率更高,但是游标不经常写,总感觉写起来麻烦,还是找点儿直观些的做法。

于是网上搜到一种解决办法,用临时表和while循环,借鉴下来写如下操作:

ContractedBlock.gif ExpandedBlockStart.gif Temptable Update Method one
 1 CREATE TABLE #tb
 2 (
 3     ID    int not null identity(1,1),
 4     a    int,
 5     b    varchar(50)
 6 )
 7 declare @rows    int
 8 declare @counter    int
 9 declare @crow    int
10 
11 insert into #tb(b) values('y')
12 insert into #tb(b) values('n')
13 insert into #tb(b) values('n')
14 insert into #tb(b) values('y')
15 
16 select @rows=@@rowcount
17 select @counter=1
18 select @crow=0
19 while @counter<@rows
20 begin
21     IF EXISTS(SELECT * FROM #TB where ID=@counter and b='y')
22     begin
23     update #tb
24     set a=@crow
25     where id=@counter and b ='y'
26 
27     SET @crow=@crow+1
28     end
29     SELECT @counter=@counter+1
30 end


写了之后发现可以有改进的地方,于是就改了一下写法:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 CREATE TABLE #tb
 2   (
 3       ID    int not null identity(1,1),
 4       a    int,
 5       b    varchar(50)
 6   )
 7   declare @rows    int
 8   declare @counter    int
 9   declare @crow    int
10  
11  insert into #tb(b) values('y')
12  insert into #tb(b) values('n')
13  insert into #tb(b) values('n')
14  insert into #tb(b) values('y')
15  
16  select @rows=@@rowcount
17  select @counter=1
18  select @crow=0
19  while @counter<@rows
20 begin
21      update #tb
22      set a=@crow,@crow=@crow+1
23      where id=@counter and b ='y'
24  
25      SELECT @counter=@counter+1
26  end


 朋友们有什么更高效,更合适的写法,可以晒出来交流下。

=======

另 case when的两种写法:

SELECT A=CASE WHEN <CONDITION> THEN <STATEMENTS> [ELSE <STATEMENTS>] END FROM tableName

SELECT A= CASE <EXPRESSION> WHEN <value or expression> THEN <STATEMENTS> [ELSE <STATEMENTS>] END FROM tableName

转载于:https://www.cnblogs.com/neilvension/archive/2009/06/10/1500526.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值