2017-09-25 10 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 - Where case with

답변

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

이처럼 문을 변경할 수 있습니다 : 당신은 그냥 사용하도록 WHERE 문을 변경해야합니다 같은

것 같습니다 : 그냥 WHERE 문을 변경해야 할 것 같은

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

것 같습니다 또는 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