ANY 测试与 SQL 比较运算符(=、>、<、>=、<=、!=、<>、!>、!<)之一联合使用,它可以将单个值与子查询生成的一列数据值进行比较。为了执行该测试,SQL 使用指定的比较运算符来将测试值与该列中的每一数据值进行比较。如果任一 比较运算生成的结果为 TRUE,ANY 测试便返回 TRUE。
与 ANY 一起使用的子查询必须返回单列。
查找在订单 #2005 的第一批产品已发出之后所发的那些订单的订单 ID 和客户 ID。
SELECT ID, CustomerID FROM SalesOrders WHERE OrderDate > ANY ( SELECT ShipDate FROM SalesOrderItems WHERE ID=2005 ); |
ID | CustomerID |
---|---|
2006 | 105 |
2007 | 106 |
2008 | 107 |
2009 | 108 |
... | ... |
执行此查询时,主查询根据订单 #2005 每个 产品的发运日期测试每个订单的订单日期。如果某个订单日期晚于订单 #2005 一批 货物的发运日期,则 SalesOrders 中的该 ID 和客户 ID 将成为结果集的一部分。ANY 测试与 OR 运算符类似:可以将上述查询理解为 "此销售订单是在订单 #2005 的第一批产品发运之后所下,是在订单 #2005 的第二批产品发运之后所下,还是……"
ANY 运算符可能会造成一点混淆。它很容易使人将该查询理解为 [返回在已发运订单 #2005 的任何产品之后所下的那些订单]。但这意味着该查询将返回订单 #2005 的所有 产品都已发运后所下订单的订单 ID 和客户 ID—这并不是该查询的结果。
请试着改为这样理解该查询:"对于在发运了订单 #2005 的至少一个 产品后所下的订单,返回它们的订单 ID 和客户 ID。"使用关键字 SOME 可以更直观地表达出该查询。以下查询等同于上一查询。
SELECT ID, CustomerID FROM SalesOrders WHERE OrderDate > SOME ( SELECT ShipDate FROM SalesOrderItems WHERE ID=2005 ); |
关键字 SOME 等同于关键字 ANY。
ANY 测试还有两个重要特性:
子查询结果集为空 如果子查询生成空结果集,则 ANY 测试返回 FALSE。这是有意义的,因为如果没有任何结果,则至少有一个结果满足比较测试就不成立了。
子查询结果集中的值为 NULL 假设在子查询结果集中至少有一个 NULL 值。如果对于结果集中的所有非 NULL 数据值比较测试均为 FALSE,则 ANY 搜索返回 UNKNOWN。原因在于,在此情况下,您无法明确断定其比较测试为真的子查询是否具有值。可能有也可能没有值,具体情况取决于结果集中 NULL 数据的正确 值。有关 ANY 搜索条件的详细信息,请参见ANY 和 SOME 搜索条件。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |