2017-09-25 22 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 

CostRule.ModelNameのデータ長に応じて私のwhereステートメントを定義したいと思います。しかし、私はエラー: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ステートメントを使用して、そのような条件を定義することはできません。それは(それが両方のブランチで同じであるためCostRule.ColorType = 1のような)に除去することができたいくつかの他のものがありますが、単にいくつかのブール論理を使用する

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) 

容易になりますが、私はどのように説明するために、ここでそれらを残してきました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文を変更する必要がありますように見えます:

あなたは自分の文を使用するかを変更する必要がありますように見えますまたは、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 
関連する問題