2017-09-02 87 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)