2017-09-02 95 views
-2

任何人都可以请更正我嵌套的Select Case When的语法。嵌套Select Case的语法错误

Update [Tab-2 sourcing] 
set POQty = a.Quantity 
from 
(
    select 
    case when D.POQty > [Tab-2 sourcing].OpenQuantity 
    then D.POQty 
    case when D.POQty < [Tab-2 sourcing].OpenQuantity 
    then 
    (
     case when D.POQty > [Tab-2 sourcing].AlreadyAlloted 
     then D.POQty 
    ) 
    as Quantity 
    from DemandPortal D 
    inner join [Tab-2 sourcing] 
    on 
    D.PONumber = [Tab-2 sourcing].PONumber 
)a 

我是新来的sql server,所以不知道如何编写正确的选择大小写。

+0

请解释所需的逻辑。从显然不工作的逻辑推断正确的逻辑并不容易! –

+1

'...时......时......时......然后......其他......结束......“的情况。 'else'部分是可选的。 – jarlh

+0

“End”关键字丢失 – Anagha

回答

1

A CASE语句就像C#语言中的switch语句。基本上这是一个复合结构,可以按照一系列if/else排列。正如其中一条评论所述,通常采用case when <first condition> then <result on first condition> when <nth condition> then <result of nth condition> <optional else clause> end的形式。请注意可选的else子句。如果省略,则任何不符合其中一个条件的值将被设置为空。

从你的例子中,我不太清楚你想要在这里得到什么;您已经布置的两条路径最终都映射到D.POQty,而case语句只有在映射到不同的值时才有用。如果你想要的只是空行为,那就这样吧。但是你可能不需要case语句,或者至少不需要这种复杂性。

这就是说,为了展示如何重构代码以使语句运行,下面是我想到的。我删除了你的子查询,因为你可以直接从case语句更新列。我还结合了你所拥有的复合病例陈述,因为我没有看到它所添加的内容,只是简单地将这两种情况结合在一起就行不通。如果我不明白你的问题,请告诉我。

update t2s -- References which aliased table you intend to update 
set POQty = case when D.POQty > [Tab-2 sourcing].OpenQuantity 
       then D.POQty 
       when D.POQty < [Tab-2 sourcing].OpenQuantity and D.POQty > [Tab-2 sourcing].AlreadyAlloted 
       then D.POQty 
       else null -- This is implied if you leave it off. Just adding it in so that its behavior is clear 
      end 
from DemandPortal D 
inner join [Tab-2 sourcing] t2s 
    on D.PONumber = t2s.PONumber 

CASE语句文档:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql

1

我认为case语句是没有必要的。您可以在where子句中执行所有检查:

UPDATE T 
    SET POQty = D.POQty 
FROM 
    [Tab-2 sourcing] T 
    INNER JOIN DemandPortal D 
     ON T.PONumber = D.PONumber 
WHERE 
    D.POQty > T.OpenQuantity OR 
    (D.POQty < T.OpenQuantity AND D.POQty > T.AlreadyAlloted)