用于各种SQL更新的大小写表达式
我正在努力使用case表达式来确定要执行哪个update语句。以下是可能的还是我应该为每个更新创建单独的更新存储过程用于各种SQL更新的大小写表达式,sql,sql-server,tsql,sql-update,case,Sql,Sql Server,Tsql,Sql Update,Case,我正在努力使用case表达式来确定要执行哪个update语句。以下是可能的还是我应该为每个更新创建单独的更新存储过程 IF (SELECT pick FROM warehouse WHERE order_no = @order_no and pick = @pick) is null CASE @pick when 1 then UPDATE warehouse SET pick = @pick, startpickdate=@
IF (SELECT pick FROM warehouse WHERE order_no = @order_no and pick = @pick) is null
CASE @pick
when 1 then
UPDATE warehouse
SET pick = @pick, startpickdate=@dchar, startpicktime=@tchar
where order_no=@order_no
when 2 then
UPDATE warehouse
SET pick = @pick, endpickdate=@dchar, endpicktime=@tchar
where order_no=@order_no
when 0 then
UPDATE warehouse
SET pick = @pick, endpickdate='', endpicktime='',startpickdate='', startpicktime=''
where order_no=@order_no
END
GO
如果您想有条件地更新列,这种方法将适合您
UPDATE Warehouse
SET Pick = @pick
, startPickDate = CASE @pick
WHEN 1 THEN @dchar
WHEN 2 THEN startPickDate
WHEN 0 THEN ''
END
, startPickTime = CASE @pick
WHEN 1 THEN @tchar
WHEN 2 THEN startPickTime
WHEN 0 THEN ''
END
, ...
WHERE order_no = @order_no
不用于T-SQL。因此,一种方法是继续使用IF实际控制流,这将允许您简化update语句,尽管每个分支都有一个:
IF (SELECT pick FROM warehouse WHERE order_no = @order_no AND pick = @pick) IS NULL BEGIN
IF @pick = 1 BEGIN
UPDATE warehouse
SET pick = @pick, startpickdate=@dchar, startpicktime=@tchar
WHERE order_no=@order_no
END
ELSE IF @pick = 2 BEGIN
UPDATE warehouse
SET pick = @pick, endpickdate=@dchar, endpicktime=@tchar
WHERE order_no=@order_no
END
ELSE IF @pick = 0 BEGIN
UPDATE warehouse
SET pick = @pick, endpickdate='', endpicktime='',startpickdate='', startpicktime=''
WHERE order_no=@order_no
END
END
GO
如果您处于存储过程中,您可能会发现它更易于维护,尽管这当然是主观的
我可能倾向于使用这种方法,而不是使用case的一个大型组合update语句,因为在每种情况下都要更新不同的列。-1当@pick不在0,1,2中时,语义不一样。还有可能触发测试更新unnecessarily@RichardTheKiwi您是正确的,但如果您有可能获得0-2范围以外的值,则可以轻松添加ELSE案例。我处理过的大多数触发器也会检查插入的值与删除的值是否不同——虽然你是正确的,但某些触发器会带来问题。在处理新手时,我很担心更改查询语义。因为他们不会真正理解事情已经改变了。@RichardTheKiwi说得对。另外,由于-1的原因,您可能想考虑使用如果不存在的话,从仓库中选择pick,其中order_no=@order_no和pick=@pick.Which DBMS?我假设SQL Server基于您的其他问题。