【问题标题】:Case expression does not return the "else" value in Postgres query案例表达式在 Postgres 查询中不返回“else”值
【发布时间】:2014-01-02 23:31:06
【问题描述】:

我正在创建一个包含大量嵌套查询的 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

我遇到的问题是当我根据“minutes_played”进行案例陈述以查看其中一名球员(队长)是否没有上场时:

(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,

当 minutes_played 确实大于 0 时,一切正常。但是,当它等于 0 时,它不会“返回”任何东西,并且我在行中得到一个 NULL 作为回报。 minutes_played 是一个整数,当我在 player_fixtures 上尝试以下脚本时,minutes_played = 0 我的 > 评估有效,我得到正确的“BAD”。

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

我在整个数据库方面都很陌生,所以我可能犯了一个新手错误,但过去 6 小时我一直在尝试,但没有任何运气。有人能指出我正确的方向吗?

【问题讨论】:

  • 如果您在案例语句中使用别名会发生什么,例如第一个:CASE WHEN pfix.minutes_played > 0 THEN g.captain_id ELSE g.vice_captain_id END
  • @cha 已经尝试过在任何地方使用别名或没有别名,也没有用:(

标签: sql postgresql rails-postgresql case-expression


【解决方案1】:

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

改为使用exists(),例如:

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

或者您可以在存储过程中使用if exists(...) then

【讨论】:

    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2023-03-12
    • 2014-12-25
    • 1970-01-01
    相关资源
    最近更新 更多