当我需要IF ..Else而不是Case

时间:2014-05-14 11:58:13

标签: sql sql-server-2008

我有一张桌子,叫做solr。使用下面的Scripti将此更新为solr表。但在这里,我怀疑是否需要使用If ... Else条件。

我对这个没有任何想法。请帮助我。

UPDATE solr
SET Stock=
  CASE
    WHEN SUD.D_price='ABC'
    OR SUD.D_price  ='CDE'
    AND WIS.StockID >0
    THEN 'Y'
    WHEN SUD.Display_price='XYZ '
    OR SUD.Display_price  ='PQR'
    AND WIS.StockID       >0
    AND WI.StockName NOT LIKE '%GGR%'
    THEN 'Y'
  END
FROM InventoryItems WIS
JOIN solr SUD
ON WIS.ProductID=SUD.ProductId
JOIN WS_Inventory WI
ON WI.StockID=WIS.StockID

4 个答案:

答案 0 :(得分:3)

我真的不明白你的问题,但我确实知道这一点......每当你在条件中混合使用OR时,你应该使用括号来控制操作的顺序。

  CASE
    WHEN (SUD.D_price='ABC' OR SUD.D_price  ='CDE') 
         AND WIS.StockID >0
    THEN 'Y'
    WHEN (SUD.Display_price='XYZ' OR SUD.Display_price ='PQR') 
         AND WIS.StockID > 0
         AND WI.StockName NOT LIKE '%GGR%'
    THEN 'Y'
    ELSE -- You should probably have some value here.
  END

答案 1 :(得分:1)

你没有准确解释你想要什么,但我猜测你需要一个else条款。如果要将值设置为'N',请使用:

UPDATE solr
    SET Stock = (case when SUD.D_price = 'ABC' OR SUD.D_price = 'CDE' AND WIS.StockID > 0
                      THEN 'Y' 
                      WHEN SUD.Display_price='XYZ ' OR SUD.Display_price='PQR' AND WIS.StockID>0 AND WI.StockName NOT LIKE '%GGR%' 
                      THEN  'Y' 
                      ELSE 'N'
                 end)
   from solr SUD join
        InventoryItems WIS
        on WIS.ProductID = SUD.ProductId JOIN
        WS_Inventory WI
        ON WI.StockID = WIS.StockID;

也许你想要:

                      ELSE stock

这不会改变价值。您也可以在where子句中添加条件,仅更新为Y,如果这是您的意图。我认为不需要if

答案 2 :(得分:1)

根本不知道数据,但我的猜测是你嵌套的ANDs和ORs弄乱它使用paranthesis来强制它们被评估的顺序,因为默认行为不是优先于AND,并且优先于OR。

NOT - > AND - >或者

如果你不太注意sql server将以什么顺序评估每个表达式,这可能会有点混乱。使用Paranthesis使得更简单。

UPDATE SUD
SET SUD.Stock = CASE
                    WHEN (SUD.D_price='ABC' OR SUD.D_price  ='CDE') 
                             AND WIS.StockID > 0
                       THEN 'Y'
                    WHEN (SUD.Display_price='XYZ ' OR SUD.Display_price  ='PQR') 
                        AND WIS.StockID > 0  AND WI.StockName NOT LIKE '%GGR%'
                       THEN 'Y'
                   --ELSE 'N'  --<-- Default value
                  END
FROM InventoryItems WIS INNER JOIN solr SUD
ON WIS.ProductID = SUD.ProductId
INNER JOIN WS_Inventory WI
ON WI.StockID = WIS.StockID

答案 3 :(得分:0)

您可以添加ELSE ..

UPDATE  solr
SET     Stock = CASE WHEN SUD.D_price = 'ABC'
                          OR SUD.D_price = 'CDE'
                          AND WIS.StockID > 0 THEN 'Y'
                     WHEN SUD.Display_price = 'XYZ '
                          OR SUD.Display_price = 'PQR'
                          AND WIS.StockID > 0
                          AND WI.StockName NOT LIKE '%GGR%' THEN 'Y'
                     ELSE 'N'
                END
FROM    InventoryItems WIS
        JOIN solr SUD ON WIS.ProductID = SUD.ProductId
        JOIN WS_Inventory WI ON WI.StockID = WIS.StockID

我在这种情况下只假设N