2017-09-25 145 views
0
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 

我想定义我的WHERE语句取决于CostRule.ModelName数据长度。但我得到一个错误:Incorrect syntax near '='。在CostRule.Type = 1和我在ELSE声明中出错。SQL - 在与CASE语句

回答

4

必须是这样的:

... 
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风格不能工作。

+0

这就是我想要的!谢谢。 –

0

您不能使用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语句转换为布尔逻辑集。

1

你可以改变你的声明是这样的:

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 
0

它看起来像你只需要改变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