【问题标题】:Select Case determines Exit code or run Update statement选择案例确定退出代码或运行更新语句
【发布时间】:2015-10-18 05:30:13
【问题描述】:

尝试获取 select case 语句来控制是否没有任何反应或根据来自两个不同表的三个字段的总和来更新表。其中一个表是临时表 (#tempGLsum)。这包含 id 字段和总金额。 tblPcardGL 表中的“amt”字段不应低于 0(零)。如果是这样,那么流程应该停止。如果它仍然 > 0,则将运行下一个代码块,更新 tblPcardGL 表。

如有任何帮助,我们将不胜感激! 谢谢

declare @glID int

create table #tempGLsum
    (glID  int, sumAmt decimal(18,2))

insert into #tempGLsum
    (glID, sumAmt)

        select      tblPcardReclass.glID,
                    sum(tblPcardReclass.reclassAmt)

        from tblPcardReclass

        where tblPcardReclass.glID = @glID

        group by tblPcardReclass.glID


select 
        case when (tblPcardGL.orgAmt - tblPcardGL.amt - #tempGLsum.sumAmt) < 0
            then 'stop here and let the user know it's below zero'
            else
            'run the code_below'
        end                         

from tblPcardGL

left outer join #tempGLsum ON
                tblPcardGL.glID = #tempGLsum.glID

where   tblPcardGL.glID = @glID         

--code_below

    update tblPcardGL
    set amt =
    (
    select 
            case (select COUNT(*) as numRecs from #tempGLsum)
                when 0 then
                    tblPcardGL.orgAmt 

                else
                    (tblPcardGL.orgAmt - #tempGLsum.sumAmt) 
            end
    )
    from tblPcardGL

    left outer join #tempGLsum ON
                    tblPcardGL.glID = #tempGLsum.glID

    where tblPcardGL.glID = @glID

【问题讨论】:

  • 选择语句不会“在中间停止并执行下面的一些代码”。这根本不是这样的。我认为您需要尝试更清楚地解释您在这里要做什么。
  • 你在寻找类似if ( select case ... end ) = 42 begin ... end else begin ... end;的东西吗?
  • @SeanLange:嗯,这就是我最终想要做的。但如果它不能那样工作,那也没关系。我愿意以任何方式工作。所以,我需要做的是当用户通过网页提交和调整这条记录时,“剩余金额”(amt)字段不能小于零。 “原始金额”决定了可以调整多少。调整的记录可以有好几条,所以我一开始就把它们加起来。然后我想评估 org amt 减去现有 amt 之间的差异。我正在接近 Brian Pressler 的回应。

标签: sql-server tsql sql-update case


【解决方案1】:

你不能用case语句做你想做的事。您只需分两步完成:

首先运行带有 where 子句的 select 以向用户显示所有问题:

select tblPcardGL.*, 'Below Zero!' Error                
from tblPcardGL
left outer join #tempGLsum ON
                tblPcardGL.glID = #tempGLsum.glID
where   tblPcardGL.glID = @glID 
    and (tblPcardGL.orgAmt - tblPcardGL.amt - #tempGLsum.sumAmt) < 0

然后使用另一个 where 子句进行更新:

update tblPcardGL
set amt =
(
select 
        case (select COUNT(*) as numRecs from #tempGLsum)
            when 0 then
                tblPcardGL.orgAmt 
            else
                (tblPcardGL.orgAmt - #tempGLsum.sumAmt) 
        end
)
from tblPcardGL
left outer join #tempGLsum ON
                tblPcardGL.glID = #tempGLsum.glID
where tblPcardGL.glID = @glID
    and (tblPcardGL.orgAmt - tblPcardGL.amt - #tempGLsum.sumAmt) >= 0

您应该考虑将所有#tempGLsum.sumAmt 字段包装在isnull(#tempGLsum.sumAmt,0) 中,因为您使用了left join,因此该列的计算结果可能为null,这会使它所在的任何表达式变为null。

【讨论】:

  • 感谢您的示例和反馈。我让它工作了!现在我只需要学习如何“回滚”最后一个条目。并感谢 isnull 提醒!
猜你喜欢
  • 2012-11-10
  • 2012-08-04
  • 1970-01-01
  • 2023-04-11
  • 2016-09-23
  • 2020-12-13
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
相关资源
最近更新 更多