2017-12-23 10 views
1

かなり複雑なSQLクエリを作成したいのですが、条件によっては0/1またはTRUE/FALSEとなります。カウント条件が0より大きい場合のcase文の作成

アイデアは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。 。 。単に 'またはexist()'を使用してください。 –

関連する問題