2017-05-05 1 views
3

나는 곧장 겉으로 드러나지 만 어떤 이유로 나는 타격 선택에서 내 널 값을 제거 할 수없는 문제가있다. 이 작업을 수행하기 위해서는 NULL 값이없는 행 하나만 반환하면됩니다. 누군가 내 방식으로 오류를 지적 할 수 있습니까? :)이 놈들 빼기 NULLS

실행할 때 내가 얻을 결과 :

EffectiveDate   Refund 
2015-05-18 00:00:00.000 NULL 
2015-05-18 00:00:00.000 1 

내가 다시 기대 :

EffectiveDate   Refund 
2015-05-18 00:00:00.000 1 

내 쿼리 :

select md.EffectiveDate, 
     CASE 
     WHEN 
      ISNULL(ConfigID,'') = 3 THEN '1' 
     WHEN 
      ISNULL(ConfigID,'') = 4 THEN '2' 
     END AS Refund 
from dbo.PartnerBankConfig md 
where md.PartnerID= 100000509 
and md.EffectiveDate = (select max(EffectiveDate) 
         from dbo.PartnerBankConfig 
         where PartnerID = 100000509 
         and ISNULL(ConfigID,'') IS NOT NULL) 
+3

당신은 다음 빈 문자열로 널 (null)을 변환하는 ISNULL을 사용하는 경우 것은 NOT NULL는 않을 것입니다 True로 평가하십시오 ... –

+2

@JacobH : 거짓으로 평가되지 않습니다 –

+0

'및 ISNULL (ConfigID, '') IS NOT NULL)을'및 ConfigID IS NOT NULL'로 바꿉니다. –

답변

3

당신에게 데이터가 case 문에서 어떤 조건과도 일치하지 않기 때문에이 null을 얻습니다. 즉, 해당 행에 3 또는 4가 아닌 ConfigID 값이 있습니다. 조건이 일치하지 않을 경우 case 문의 동작은 null로 평가되므로 null이이 행에 대해 반환됩니다.

또한이 함수는 ISNULL(ConfigID,'')이며 모든 null을 빈 문자열 (null이 아닌 값)로 바꿉니다.

따라서 ISNULL(ConfigID,'') IS NOT NULL은 의미가 없습니다. ISNULL은 항상 null이 아닌 값을 반환하기 때문에 항상 true가됩니다. 아무 것도 필요하지 않으므로 쿼리에서 ISNULL()의 모든 사용을 제거해야합니다.

3

Dan이 설명한대로 ISNULL()을 사용하는 것은 적절하지 않습니다. 더 간단하게

select md.EffectiveDate, 
     (CASE WHEN ConfigID = 3 THEN 1 
      WHEN ConfigID = 4 THEN 2 
     END) as Refund 
from (select md.*, max(EffectiveDate) over (partition by PartnerId) as maxed 
     from dbo.PartnerBankConfig md 
     where md.PartnerID = 100000509 and 
      configId in (3, 4) 
    ) md 
where md.EffectiveDate = maxed; 

또는 : 당신의 설명에서,이 간단한 쿼리 할 것 같다 잘

select top (1) with ties md.EffectiveDate, 
     (CASE WHEN ConfigID = 3 THEN 1 
      WHEN ConfigID = 4 THEN 2 
     END) as Refund 
from (select md.*, max(EffectiveDate) over (partition by PartnerId) as maxed 
     from dbo.PartnerBankConfig md 
where md.PartnerID = 100000509 and 
     ConfigId in (3, 4) 
order by EffectiveDate desc; 
+0

모두의 의견을 보내 주셔서 감사합니다. 나는 옳은 방향으로 가고 있다고 생각합니다. 다시 한번 감사드립니다! – PeteMiller