簡體   English   中英

SQL-使用CASE語句的位置

[英]SQL - WHERE with CASE statement

   SELECT TOP 1
        CostValue 
    FROM 
        [~client_table~].[dbo].[CostRules] AS CostRule 
    WHERE 
        (CASE
            WHEN DATALENGTH(CostRule.ModelName) = 0 
            THEN 
                CostRule.Type = 1
                AND CostRule.Manufacturer = Printer.ManufacturerId
                AND CostRule.ColorType = 1
            ELSE
                CostRule.Type = 2
                AND CostRule.ModelName = Printer.ModelName
                AND CostRule.ColorType = 1
            END
        )
    ) AS MonoCost

我想根據CostRule.ModelName的數據CostRule.ModelName定義where語句。 但是我遇到一個錯誤: Incorrect syntax near '=' CostRule.Type = 1 ,我在ELSE語句中收到錯誤。

必須是這樣的:

...
WHERE
  (DATALENGTH(CostRule.ModelName) = 0
    AND CostRule.Type = 1
    AND CostRule.Manufacturer = Printer.ManufacturerId
    AND CostRule.ColorType = 1)
  OR
  (DATALENGTH(CostRule.ModelName) != 0
    AND CostRule.Type = 2
    AND CostRule.ModelName = Printer.ModelName
    AND CostRule.ColorType = 1)

您的查詢中的CASE樣式無效。

您可以這樣更改語句:

SELECT TOP 1
    CostValue 
FROM 
    [~client_table~].[dbo].[CostRules] AS CostRule 
WHERE CostRule.ColorType=1
AND CostRule.Type=CASE WHEN  DATALENGTH(CostRule.ModelName) = 0  THEN 1 ELSE 2 END 
AND CostRule.Manufacturer=CASE WHEN  DATALENGTH(CostRule.ModelName) = 0 THEN Printer.ManufacturerId ELSE  Printer.ModelName END 

您不能使用CASE語句來定義類似的條件。 僅使用一些布爾邏輯會更容易

SELECT *
FROM your_table
WHERE (DATALENGTH(CostRule.ModelName) = 0 
       AND CostRule.Type = 1
       AND CostRule.Manufacturer = Printer.ManufacturerId
       AND CostRule.ColorType = 1)
OR (DATALENGTH(CostRule.ModelName) != 0
       AND CostRule.Type = 2
       AND CostRule.ModelName = Printer.ModelName
       AND CostRule.ColorType = 1)

還可以刪除其他一些內容(例如CostRule.ColorType = 1因為兩個分支中的相同),但是我將其留在此處以說明如何將CASE語句轉換為布爾邏輯集。

看來您只需要更改WHERE語句即可:

看來您只需要更改WHERE語句即可使用OR並刪除CASE語句。

(SELECT TOP 1
        CostValue 
    FROM 
        [~client_table~].[dbo].[CostRules] AS CostRule 
    WHERE 
                DATALENGTH(CostRule.ModelName) = 0 
                CostRule.Type = 1
                AND CostRule.Manufacturer = Printer.ManufacturerId
                AND CostRule.ColorType = 1
      OR
                DATALENGTH(CostRule.ModelName) <> 0  
                AND CostRule.Type = 2
                AND CostRule.ModelName = Printer.ModelName
                AND CostRule.ColorType = 1

     ) AS MonoCost

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM