Sql 大小写表达式不返回;否则";Postgres查询中的值

Sql 大小写表达式不返回;否则";Postgres查询中的值,sql,postgresql,rails-postgresql,case-expression,Sql,Postgresql,Rails Postgresql,Case Expression,我正在创建一个包含大量嵌套查询的SQL查询,并尝试使用CASE表达式,但它的行为异常 这是我目前的问题: select t.fpl_id, t.team_name, sum(pf.points)as gwpts, ( select sum(transfers_malus) from gameweeks where gameweeks.team_id = t.id and gameweeks.number = g.number )as malus, ( select

我正在创建一个包含大量嵌套查询的SQL查询,并尝试使用CASE表达式,但它的行为异常

这是我目前的问题:

select t.fpl_id, t.team_name,
sum(pf.points)as gwpts,
(
    select sum(transfers_malus)
    from gameweeks
    where gameweeks.team_id = t.id and gameweeks.number = g.number
)as malus,
(
    select sum(points)
    from player_fixtures as pfix
    where gw_number = g.number and pfix.player_id = CASE WHEN minutes_played > 0 THEN g.captain_id ELSE g.vice_captain_id END
)
as cpts,
 (
    select max(web_name)
    from players
    join player_fixtures on players.id = player_fixtures.player_id and gw_number = g.number
    where players.id = CASE WHEN player_fixtures.minutes_played > 0 THEN g.captain_id ELSE g.vice_captain_id END
) as captain_name,
array_agg(p.id) as lineup
from teams as t
join gameweeks as g on t.id  = g.team_id
join gameweeks_players as gp on gp.gameweek_id = g.id
join players as p on gp.player_id = p.id
join player_fixtures as pf on p.id = pf.player_id  and pf.gw_number = g.number
where t.id = 1
group by t.id, g.id
order by g.number asc
我遇到的问题是,我在做案例陈述时,根据“上场分钟数”判断球员(队长)中是否有人没有上场:

当播放的分钟数确实大于0时,一切正常。然而,当它等于0时,它不会“返回”任何东西,并且我的行中会得到一个NULL。minutes_played是一个整数,当我在player_fixture上尝试使用以下脚本时,其中minutes_played=0,我的>评估有效,我得到了正确的“BAD”


我对DB这整件事还很陌生,所以我可能犯了一个新手错误,但在过去的6个小时里我一直在尝试,没有任何运气。有人能给我指出正确的方向吗?

问题是,当没有匹配的行时,
sum()
返回null,与null的比较永远不会为真

相反,请使用
exists()
,例如:

where exists(select * from player_fixtures
    where gw_number = 19
    and player_id = 266 
    and minutes_played > 0)

或者您可以在存储过程中使用
(如果存在)(…),然后使用

如果您在case语句中使用别名会发生什么情况,例如,对于第一个:
当pfix.minutes\u播放时的case>0,然后g.captain\u id ELSE g.vice\u captain\u id END
@cha已在任何地方尝试使用别名,或者没有别名,但也不起作用:(
 (
    select max(web_name)
    from players
    join player_fixtures on players.id = player_fixtures.player_id and gw_number = g.number
    where players.id = CASE WHEN player_fixtures.minutes_played > 0 THEN g.captain_id ELSE g.vice_captain_id END
) as captain_name,
DO LANGUAGE plpgsql $$
    BEGIN
        IF (select minutes_played from player_fixtures where gw_number = 19 and player_id = 266 ) > 0 THEN 
            RAISE NOTICE 'GOOD';
        ELSE
            RAISE NOTICE 'BAD';
        END IF;
    END;
$$;
where exists(select * from player_fixtures
    where gw_number = 19
    and player_id = 266 
    and minutes_played > 0)