2017-12-23 6 views
1

내 조건에 따라 0/1 또는 TRUE/FALSE가되는 매우 복잡한 SQL 쿼리를 만들고 싶습니다.카운트 조건이 0보다 큰 경우 case 문 만들기

I을 :

아이디어는 내가 고객 테이블이 다음 내가 다른 테이블에서 검사의 몇 가지를 만들고 싶어하고, 하나에 해당하는 다음 있다면, 우리가 FALSE, TRUE를 반환하고, 그렇지 않은 경우이다 CASE로 이것을 할 생각이었습니다. 이 반환

select 
    case 
     ((select count(*) from boughtleads bl where bl.customerid = cu.id)>0) 
      then 'TRUE' 
      else 'FALSE' 
    end 

from customers cu 
left join leadagents la on la.customerid = cu.id 
where cu.vatnumber = '30218124' 

:

Msg 102, Level 15, State 1, Line 3 
Incorrect syntax near '>'. 

내 문제는 그 다음입니다 아래의 예를 참조하십시오. 우선, 위의 쿼리가 어떤 이유로 실패하고, 내 다른 문제는 OR을 사용할 수 없다는 것입니다. 이 공격하는 방법에 대한

select 
    case 
     (
      ((select count(*) from boughtleads bl where bl.customerid = cu.id)>0) 
      OR 
      ((select count(*) from leadnotifications ln where ln.leadagentid = la.id)>)) 
       then 'TRUE' 
       else 'FALSE' 
    end 

from customers cu 
left join leadagents la on la.customerid = cu.id 
where cu.vatnumber = '30218124' 

어떤 아이디어 :

내 이상적인 의사는 같은 것입니까?

답변

3

당신은 when 누락 : exists를 사용하여 이러한 조건을 작성하는 더 나은 성능의 관점에서 말했다

select (case when (select count(*) from boughtleads bl where bl.customerid = cu.id) > 0 
      then 'TRUE' 
      else 'FALSE' 
     end) 
from customers cu left join 
    leadagents la 
    on la.customerid = cu.id 
where cu.vatnumber = '30218124'; 

:

select (case when exists (select 1 from boughtleads bl where bl.customerid = cu.id) 
      then 'TRUE' 
      else 'FALSE' 
     end) 
from customers cu left join 
    leadagents la 
    on la.customerid = cu.id 
where cu.vatnumber = '30218124' 

count(*) 버전은 모든 일치를 찾을 수있다 행은 boughtleads입니다. exists 버전은 첫 번째 경기에서 중단 될 수 있습니다.

+0

젠장, 물론. 고마워요! "OR"진술에 대한 힌트가 있습니까? :) –

+0

@LarsHoldgaard. . . 그냥'또는 exists()'를 사용하십시오. –