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 行,依此类推。
非常感谢任何帮助!
当执行包含 null
的 SELECT
列时,该值将始终是,因此永远不会填充 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;
未经测试,但这应该提供了一般方法。基本上,你 JOIN
到 teams
到 table 两次,但是使用不同的条件,然后你需要计算分数。我在这里使用 NULL
表示平局。
根据 OP 的评论进行编辑:
是一样的table -- teams
-- 但是JOIN
产生不同的结果,因为查询使用了不同的JOIN
条件 在每个 JOIN
.
第一个 JOIN
,对于 t_loc
,比较 m.nom_eqpo_loc
和 t.num_eqpo
。这意味着它获得 home 团队的 teams
行。
第二个 JOIN
,对于 t_vis
,比较 m.nom_eqpo_vis
和 t.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
元组。
我得到以下 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 行,依此类推。
非常感谢任何帮助!
当执行包含 null
的 SELECT
列时,该值将始终是,因此永远不会填充 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;
未经测试,但这应该提供了一般方法。基本上,你 JOIN
到 teams
到 table 两次,但是使用不同的条件,然后你需要计算分数。我在这里使用 NULL
表示平局。
根据 OP 的评论进行编辑:
是一样的table -- teams
-- 但是JOIN
产生不同的结果,因为查询使用了不同的JOIN
条件 在每个 JOIN
.
第一个 JOIN
,对于 t_loc
,比较 m.nom_eqpo_loc
和 t.num_eqpo
。这意味着它获得 home 团队的 teams
行。
第二个 JOIN
,对于 t_vis
,比较 m.nom_eqpo_vis
和 t.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
元组。