UPDATE 语句中使用 CASE 更新列的问题?

时间:2021-05-24 00:41:39


DECLARE @I int
...
IF @I = 1 
BEGIN 
  UPDATE 表 SET 字段1 = xx 
END
  ELSE IF @I = 2 
  BEGIN
    UPDATE 表 SET 字段2 = xx 
  END
    ELSE IF @I = 3
    BEGIN
      UPDATE 表 SET 字段3 = xx 
    END
...



一大堆 IF ELSE , 想用 CASE 来实现
...

CASE @I 

  WHEN 1 BEGIN UPDATE 表 SET 字段1 = xx END

  WHEN 2 BEGIN UPDATE 表 SET 字段2 = xx END

  WHEN 3 BEGIN UPDATE 表 SET 字段3 = xx END
  
  ELSE ...
END

...





能实现不?

17 个解决方案

#1


UPDATE 
  表 
SET 
  字段1=case @I when 1 then xx else 字段1 end,
  字段2=case @I when 2 then xx else 字段2 end,
  ...

#2


不能,但可以用动态SQL。

#3


貌似不行.用動態語句吧.

#4


DECLARE @I int
DECLARE @S varchar(8000)

SET @S=
CASE @I 

  WHEN 1 THEN 'UPDATE 表 SET 字段1 = xx' 

  WHEN 2 THEN 'UPDATE 表 SET 字段2 = xx' 

  WHEN 3 THEN 'UPDATE 表 SET 字段3 = xx' 
  
  ELSE ...
END

EXEC(@S)

#5


引用 1 楼 josy 的回复:
SQL codeUPDATE表SET字段1=case@Iwhen1thenxxelse字段1end,
  字段2=case@Iwhen2thenxxelse字段2end,
  ...



顶,应该可以。

#6


用字符串?

问题是我写在触发器里,反应要求要高些

#7


不能实现的。

#8


--TRY
DECLARE @S VARCHAR(200)
DECLARE @I INT 
SET @I=3
SET @S='UPDATE 表 SET 字段'+LTRIM(@I)+'=XX'
--PRINT @S
EXEC (@S)

#9


DECLARE @CMD NVARCHAR(100).@I int

CASE @I 
  WHEN 1 @CMD='UPDATE 表 SET 字段1 = xx'
  WHEN 2 @CMD='UPDATE 表 SET 字段2 = xx'
  WHEN 3 @CMD='UPDATE 表 SET 字段3 = xx'
  ELSE END
EXEC(@CMD)

#10


DECLARE @CMD NVARCHAR(100),@I int

#11


DECLARE @I int
set @i=x

update tb set Col1=(case when @i=1 then xxx else Col1 end),
Col2=(case when @i=2 then xxx else Col2 end),
Col3=(case when @i=3 then xxx else Col3 end),
Col4=(case when @i=4 then xxx else Col4 end)
....

#12


1楼方法很巧妙啊

#13


结贴 !

#14


引用 1 楼 josy 的回复:
SQL codeUPDATE表SET字段1=case@Iwhen1thenxxelse字段1end,
  字段2=case@Iwhen2thenxxelse字段2end,
  ...

可以的,sql语言艺术这本书中就有。

#15


引用 6 楼 kwer 的回复:
用字符串? 

问题是我写在触发器里,反应要求要高些

那你的變量怎麼得來的?

#16


像这样..

declare @tb table(id int,name nvarchar(10))
insert into @tb select 1,'张三'
     union all  select 2,'李四'
     union all  select 3,'三五'
     
 declare @var int
 set @var=1
 --update @tb set id=1
 update @tb set id =  (case when @var=1 then 1  end),
                name= case when @var=1 then 'china' end
 select * from @tb


(3 行受影响)
id          name
----------- ----------
1           china
1           china
1           china

(3 行受影响)

#17


一楼的回答我也受益了,谢谢啊!!

#1


UPDATE 
  表 
SET 
  字段1=case @I when 1 then xx else 字段1 end,
  字段2=case @I when 2 then xx else 字段2 end,
  ...

#2


不能,但可以用动态SQL。

#3


貌似不行.用動態語句吧.

#4


DECLARE @I int
DECLARE @S varchar(8000)

SET @S=
CASE @I 

  WHEN 1 THEN 'UPDATE 表 SET 字段1 = xx' 

  WHEN 2 THEN 'UPDATE 表 SET 字段2 = xx' 

  WHEN 3 THEN 'UPDATE 表 SET 字段3 = xx' 
  
  ELSE ...
END

EXEC(@S)

#5


引用 1 楼 josy 的回复:
SQL codeUPDATE表SET字段1=case@Iwhen1thenxxelse字段1end,
  字段2=case@Iwhen2thenxxelse字段2end,
  ...



顶,应该可以。

#6


用字符串?

问题是我写在触发器里,反应要求要高些

#7


不能实现的。

#8


--TRY
DECLARE @S VARCHAR(200)
DECLARE @I INT 
SET @I=3
SET @S='UPDATE 表 SET 字段'+LTRIM(@I)+'=XX'
--PRINT @S
EXEC (@S)

#9


DECLARE @CMD NVARCHAR(100).@I int

CASE @I 
  WHEN 1 @CMD='UPDATE 表 SET 字段1 = xx'
  WHEN 2 @CMD='UPDATE 表 SET 字段2 = xx'
  WHEN 3 @CMD='UPDATE 表 SET 字段3 = xx'
  ELSE END
EXEC(@CMD)

#10


DECLARE @CMD NVARCHAR(100),@I int

#11


DECLARE @I int
set @i=x

update tb set Col1=(case when @i=1 then xxx else Col1 end),
Col2=(case when @i=2 then xxx else Col2 end),
Col3=(case when @i=3 then xxx else Col3 end),
Col4=(case when @i=4 then xxx else Col4 end)
....

#12


1楼方法很巧妙啊

#13


结贴 !

#14


引用 1 楼 josy 的回复:
SQL codeUPDATE表SET字段1=case@Iwhen1thenxxelse字段1end,
  字段2=case@Iwhen2thenxxelse字段2end,
  ...

可以的,sql语言艺术这本书中就有。

#15


引用 6 楼 kwer 的回复:
用字符串? 

问题是我写在触发器里,反应要求要高些

那你的變量怎麼得來的?

#16


像这样..

declare @tb table(id int,name nvarchar(10))
insert into @tb select 1,'张三'
     union all  select 2,'李四'
     union all  select 3,'三五'
     
 declare @var int
 set @var=1
 --update @tb set id=1
 update @tb set id =  (case when @var=1 then 1  end),
                name= case when @var=1 then 'china' end
 select * from @tb


(3 行受影响)
id          name
----------- ----------
1           china
1           china
1           china

(3 行受影响)

#17


一楼的回答我也受益了,谢谢啊!!