如果存在值,则聚合函数返回true

4

我有一些查询SQL语句,返回某些字段的总和,并且这些值与旗帜列相关联,旗帜列的值为“Y”或“N”。

是否有一种聚合函数,如果任何一个记录包含“Y”,则返回该标志列的真/假值?


1
max()?因为Y比N更高(我相信在所有编码中都是如此,但不确定...)但为什么选择PL/SQL?你是指真正的布尔值(在普通SQL中无法实现),还是仍然使用Y/N标志? - Alex Poole
3
如果最大的列为 'Y',则返回 true,否则返回 false。 - jarlh
2
@jarlh:你需要使用'true' - Oracle没有布尔值。 - user330315
我有点偏差,如果任何一行包含“N”,我需要返回 true,所以我尝试使用 MIN(),它给了我想要的结果。 - atamata
2个回答

5

您可以在 CASE 表达式中套用条件聚合:

CASE
    WHEN COUNT(CASE WHEN column = 'Y' THEN 1 END) > 0 THEN 'true'
    ELSE 'false'
END

谢谢,我正在考虑这个方案和@jarhl发布的解决方案之间的区别。 - atamata
@atamata max / min 也可以使用,而且可能更快。然而,这个更通用,表达意图更清晰。 - Salman A
同意这一点,可能是可读性决定使用哪个。话虽如此,它将被提取到视图中,因此希望一旦编写完成,就不需要再查看它了! - atamata

2
select nvl(max(1),0) from your_table
where column = 'Y'

我更喜欢使用COALESCE()而不是NVL(),因为COALESCE()是SQL标准的一部分,不像NVL()那样隐式转换。它还将执行短路评估,在这种特定情况下并不那么相关。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接