如何编写查询以仅在满足条件时才显示值?

Posted

技术标签:

【中文标题】如何编写查询以仅在满足条件时才显示值?【英文标题】:How to write a query to display values only if the condition is met? 【发布时间】:2022-01-10 16:33:55 【问题描述】:

这是我目前的查询:

SELECT 
    COUNT(OA.ATHLETE_NAME) AS 'Number of athletes', 
    OG.GAMES_YEAR 
FROM 
    [Olympics].[Events_Facts] AS OEF 
JOIN 
    [Olympics].[Games]  AS OG ON OEF.GAMES_ID = OG.GAMES_ID
JOIN 
    [Olympics].[Athletes] AS OA ON OEF.ATHLETE_ID = OA.ATHLETE_ID
GROUP BY 
    OG.GAMES_YEAR

我想在我的查询中指定,如果一名运动员来自德国,则仅显示 1991 年奥运会之后的参赛人数。

【问题讨论】:

使用where子句? 请用示例数据和期望的结果说明,见Minimal, Reproducible Example 你可以写类似where country <> 'germany' or year >= 1991 那么@derpirscher 的建议应该有效。 @aby_g 条件等于 (country = Germany and year > 1991) or country <> Germany 应该完全符合您的要求 【参考方案1】:
SELECT 
    COUNT(OA.ATHLETE_NAME) AS 'Number of athletes', 
    OG.GAMES_YEAR 
FROM 
    [Olympics].[Events_Facts] AS OEF 
JOIN 
    [Olympics].[Games]  AS OG ON OEF.GAMES_ID = OG.GAMES_ID
JOIN 
    [Olympics].[Athletes] AS OA ON OEF.ATHLETE_ID = OA.ATHLETE_ID
WHERE 
    OA.FROM_COUNTRY = 'Germany' and OG.GAMES_YEAR > 1991
GROUP BY 
    OG.GAMES_YEAR   
    
union all 

SELECT 
    COUNT(OA.ATHLETE_NAME) AS 'Number of athletes', 
    OG.GAMES_YEAR 
FROM 
    [Olympics].[Events_Facts] AS OEF 
JOIN 
    [Olympics].[Games]  AS OG ON OEF.GAMES_ID = OG.GAMES_ID
JOIN 
    [Olympics].[Athletes] AS OA ON OEF.ATHLETE_ID = OA.ATHLETE_ID
WHERE 
    OA.FROM_COUNTRY <> 'Germany'
GROUP BY 
    OG.GAMES_YEAR

通过使用OR 命令,我们可以更简单地编写此查询,而无需使用UNION ALL 命令。但是OR不推荐性能。

【讨论】:

如何衡量 SSMS 的性能? But OR is not recommended by performance. 这通常是正确的,但我对它作为一般建议持怀疑态度。事实上,特别是在这种情况下,我建议同时测量两种方式。原因是基线查询没有以where 子句开头,因此查询计划可能使用全表扫描。 or 影响性能,因为它使使用索引变得更加困难,但如果我们已经在查看全表扫描,or 的成本可能为 0。从可读性的角度来看,我确实更喜欢你的版本。 @Brandon 但是如果有一个索引(FROM_COUNTRY, GAMES_YEAR) 并且基线查询是OR 版本,UNION ALL 很可能会更快。是的,原件正在进行全面扫描,但需要所有结果。这与性能问题无关,您唯一应该查看的是哪个查询得到 这些 结果 @Aby_g SET STATISTICS IO, TIME ON; 是一个好的开始。你也可以使用Include Client Statistics按钮

以上是关于如何编写查询以仅在满足条件时才显示值?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:如何仅在模型关系存在时才查询模型关系

如何编写条件明智的结果提供查询?

如何显示每周发生并满足某些条件的记录总数 SQL

仅在满足某些条件时才调用 Safari Content Blocker 扩展?

仅在满足另一个条件时如何按列过滤查询

如何设置表格视图以仅在 ios 中显示单行?