用于各种SQL更新的大小写表达式

用于各种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=@

我正在努力使用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=@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基于您的其他问题。