当计数条件大于0时创建一个case语句

问题描述 投票:1回答:1

我想做一个非常复杂的SQL查询,根据我的条件,结果为0/1或TRUE / FALSE。

想法是我有一个客户表,然后我想在不同的表中进行一些检查,然后如果其中一个为真,那么我们返回TRUE,如果不是,则返回FALSE:

我想用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'

关于如何攻击这个的任何想法?

sql sql-server
1个回答
3
投票

你缺少when

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';

也就是说,从性能角度来看,最好使用exists编写这样的条件:

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版本可以在第一场比赛时停止。

© www.soinside.com 2019 - 2024. All rights reserved.