当子查询什么都不返回时,如何使0> All()返回false?

时间:2012-09-05 10:59:42

标签: sql

当子查询没有返回任何内容时,如何使0>All()返回false? 从逻辑上讲,对于我的情况,如果all()中没有任何内容,则All()不能为< 0。

示例:

select x from table 
where  0 > ALL(complex subquery)

如何修改它以使其为空列表返回false。子查询很长很复杂,我不想重复两次,一次是exists(),一次是0> ALL()

3 个答案:

答案 0 :(得分:3)

您可以使用

select x 
from table
where  x > (SELECT MAX(foo) 
                 FROM complex_subquery 
                 HAVING COUNT(*) = COUNT(foo))

如果子查询没有返回任何行,那么select MAX(foo)将返回NULLx > NULL将评估为unknown,因此WHERE不会返回。 / p>

如果NULLfoo个值,则HAVING子句用于确保查询不返回任何行,以便保持ALL的正确语义(正如@hvd

指出的那样

答案 1 :(得分:2)

(我建议马丁史密斯回答这个问题。)

一种选择是CTE:

; with  CteAlias as
        (
        ... complex subquery ...
        )
select  col1 
from    table 
where   exists (select * from CteAlias)
        and x > ALL (select col1 from CteAlias)

仅当子查询与表没有关联时才有效。

答案 2 :(得分:0)

您始终可以将complex query中返回的值存储在表变量/临时表中,然后在主查询中使用它,除非此复杂子查询依赖于主查询?

此外,您可能希望查看使用CTE进行复杂查询,并以这种方式重用代码。

  

公用表表达式(CTE)可以被认为是临时表   在单个执行范围内定义的结果集   SELECT,INSERT,UPDATE,DELETE或CREATE VIEW语句。 CTE是   类似于派生表,因为它不存储为对象和   仅持续查询的持续时间。与派生表不同,a   CTE可以是自引用的,可以多次引用   相同的查询。