2014-04-08 2 views
1
나는

CASE 문은

Table(Id int,Title varchar(250), WebCountryId int, CountryId int) 

웹 국가 ID 1000와 같은 샘플 일이 영국과 CountryId = 5와 같이 다른 열

와 함께 두 개의 국가 ID를 보유하고 테이블은 영국을위한 한

. (또한 countryid = 1은 영국으로 간주되는 알 수없는 것임). (두 countryids 자신의 국가 목록을 가지고 두 개의 서로 다른 데이터베이스에서 구동됩니다) 나는이 테이블을 사용하는보기가 있고 행이 영국인지 여부를 결정하기 위해 필드를 만들려고합니다.

이것은 내가 지금 무슨이지만,이 비트 Gona을은보기

SELECT CountryId,WebCountryId, 
     (CASE WHEN (T.WebCountryId IS NULL AND T.CountryId IS NULL) THEN 1 
       WHEN (T.WebCountryId IS NOT NULL AND T.WebCountryId <> 1000) THEN 0 
       WHEN (T.CountryId IS NOT NULL AND Enquiry.CountryId NOT in(1,5)) THEN 0 
       WHEN (T.WebCountryId IS NULL AND T.CountryId in(2,5)) THEN 1 END)as Uk   
FROM Table T 

case를 사용하지 않고이를 달성하기 위해 다른 방법이 있나요 사용할 수?

+1

이것은 NULL을 묵시적인 값으로 지정해서는 안되는 이유입니다. 모든 옵션에 값을 지정하고 null을 처리하지 않기 때문입니다. –

+1

@TMcKeown : 이것은 몸이 NULL을 허용하는 이유를 알지 못하는 아주 오래된 데이터베이스에서 작업 할 때 내가 발견 한 것입니다. –

답변

0

가능하면 쿼리가 간단한 논리로 작동하도록 데이터를 수정합니다. 그렇지 않으면 당신이 가진 것은 당신이 살아야 할 것입니다.

+0

이 경우 기존 구조를 변경할 수 없습니다. 의견을 보내 주셔서 감사합니다! –

1

UNION을 사용하면 두 세트간에 로직을 나누기 만하면됩니다.

SELECT T.CountryId 
     ,T.WebCountryId 
     ,0 AS Uk 
    FROM Table_T AS T 
    WHERE (T.WebCountryId IS NOT NULL AND T.WebCountryId <> 1000) 
     OR (T.CountryId IS NOT NULL AND Enquiry.CountryId NOT IN (1, 5)) 
UNION ALL 
SELECT T.CountryId 
     ,T.WebCountryId 
     ,1 AS Uk 
    FROM Table_T AS T 
    WHERE (T.WebCountryId IS NULL AND T.CountryId IS NULL) 
     OR (T.WebCountryId IS NULL AND T.CountryId IN (2, 5)) 
+0

보기에서 사용하는 것이 좋은 옵션일까요? –

+0

인덱스에 따라 실행 계획을 확인해야합니다. –