JOIN 中的 CASE 不工作 PostgreSQL

CASE in JOIN not working PostgreSQL

我得到以下 tables:

团队

匹配

我想得到这样的输出:

matches.semana | teams.nom_equipo | teams.nom_equipo | Winner
       1              AMERICA         CRUZ AZUL        AMERICA
       1              SANTOS           MORELIA         MORELIA
       1               LEON            CHIVAS            LEON

列 teams.nom_equipo 引用 matches.num_eqpo_lo 和 matches.num_eqpo_v,同时它们引用列 teams.nom_equipo 以获取每个团队的名称他们的id

编辑:我使用了以下内容:

SELECT m.semana, t_loc.nom_equipo AS LOCAL, t_vis.nom_equipo AS VISITANTE,
       CASE WHEN m.goles_loc > m.goles_vis THEN 'home'
            WHEN m.goles_vis > m.goles_loc THEN 'visitor'
            ELSE 'tie'
       END AS Vencedor 
FROM matches AS m
JOIN teams AS t_loc ON (m.num_eqpo_loc = t_loc.num_eqpo)
JOIN teams AS t_vis ON (m.num_eqpo_vis = t_vis.num_eqpo)
ORDER BY m.semana;

但是正如您从 goles_loc 列(主队)和 goles_vis(客队)列的第 5 行的 table 比赛中看到的那样,他们有 2 对 2(进球数 - 主场 vs 客场)平局,但是当我 运行 代码时,我得到的东西不是平局 :

比赛得分

来自 Select 的结果集:

我还注意到,由于第 5 行,比赛中两队的名字都不正确(客队和主队)。 因此,Select 带来了正确的数据,但顺序不同于原始顺序(指的是 table 匹配的顺序)

第二周的订单必须是:

        matches.semana | teams.nom_equipo | teams.nom_equipo |   Winner
  5            2              CRUZ AZUL         TOLUCA            TIE
  6            2              MORELIA           LEON              LEON
  7            2               CHIVAS           SANTOS            TIE

结果集中的第 8 行必须是第 5 行,依此类推。

非常感谢任何帮助!

当执行包含 nullSELECT 列时,该值将始终是,因此永远不会填充 winner 在您的情况下。

类似这样的内容可能更符合您的要求:

SELECT m.semana, t_loc.nom_equipo AS loc_equipo, t_vis.nom_equipo AS vis_equipo,
       CASE WHEN m.goles_loc - m.goles_vis > 0 THEN t_loc.nom_equipo
            WHEN m.goles_vis - m.goles_loc > 0 THEN t_vis.nom_equipo
            ELSE NULL
       END AS winner 
FROM matches AS m
JOIN teams AS t_loc ON (m.nom_eqpo_loc = t.num_eqpo)
JOIN teams AS t_vis ON (m.nom_eqpo_vis = t.num_eqpo)
ORDER BY m.semana;

未经测试,但这应该提供了一般方法。基本上,你 JOINteams 到 table 两次,但是使用不同的条件,然后你需要计算分数。我在这里使用 NULL 表示平局。

根据 OP 的评论进行编辑:

是一样的table -- teams -- 但是JOIN产生不同的结果,因为查询使用了不同的JOIN 条件 在每个 JOIN.

第一个 JOIN,对于 t_loc,比较 m.nom_eqpo_loct.num_eqpo。这意味着它获得 home 团队的 teams 行。

第二个 JOIN,对于 t_vis,比较 m.nom_eqpo_vist.num_eqpo。这意味着它获得 visting 团队的 teams 行。

因此,在CASE声明中,t_loc指的是主场队,而t_vis指的是 ]visting 一个,使两者都可以在 CASE 语句中使用,从而为 winning.

找到正确的名称

根据 OP 的后续评论进行编辑:

我原来的查询是按 m.semana 排序的,这意味着其他列可以按任何顺序出现(基本上 Postgres 认为最有效的那个)。

如果您希望结果 table 的排序方式与 matches table 完全相同,则使用相同的 ORDER BY 元组 在其 ORDER BY.

因此,ORDER BY 子句将变为:

ORDER BY m.semana, m.nom_eqpo_loc, m.nom_eqpo_vis

基本上,matches table PRIMARY KEY 元组。