ANY テストは、SQL 比較演算子 (=、>、<、>=、<=、!=、<>、!>、!<) のいずれかと組み合せて使用して、1 つの値をサブクエリが生成するデータ値のカラムと比較します。テストを実行するには、SQL は指定された比較演算子を使用して、テスト値をカラムのデータ値のそれぞれと比較します。いずれかの比較の結果が TRUE になる場合、ANY テストは TRUE を返します。
ANY を使用するサブクエリは 1 つのカラムを返します。
注文番号 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 の 1 つの出荷の出荷日より後であれば、SalesOrders テーブルの注文 ID と顧客 ID が結果セットに示されます。このように ANY テストは OR 演算子に似ています。前述のクエリは、「この注文は注文番号 2005 の最初の製品が出荷された後に受けたものか、または注文番号 2005 の 2 番目の製品が出荷された後に受けたものか、または ...」というように解釈できます。
ANY 演算子はやや複雑な場合があります。このクエリは、「注文番号 2005 の任意の製品が出荷された後に受けた注文を返す」と解釈してしまいがちです。しかし、それでは注文番号 2005 のすべての製品が出荷された後に受けた注文の注文 ID と顧客 ID を返すことになり、クエリの動作と異なります。
そうではなく、「注文番号 2005 の少なくとも 1 つの製品が出荷された後に受けた注文の注文 ID と顧客 ID を返す」というようにクエリを解釈してみます。キーワード SOME を使用すると、もう少し直感的な方法でクエリを表現できます。次のクエリは前述のクエリと同等です。
SELECT ID, CustomerID FROM SalesOrders WHERE OrderDate > SOME ( SELECT ShipDate FROM SalesOrderItems WHERE ID=2005 ); |
キーワード SOME はキーワード ANY と同等です。
ANY テストには、このほかに 2 つの重要な特徴があります。
空のサブクエリの結果セット サブクエリが空の結果セットを生成する場合、ANY テストは FALSE を返します。結果がない場合、少なくとも 1 つの結果が比較テストを満たしているというのは真ではないので、これは理にかなっています。
サブクエリの結果セットの NULL 値 サブクエリの結果セットには少なくとも 1 つの NULL 値があることが前提です。結果セットの NULL 以外のすべてのデータ値に対して比較テストが FALSE の場合、ANY は UNKNOWN を返します。これは、比較テストが保持するサブクエリの値があるかどうか、この状況では確定できないためです。値があるかどうかは、結果セットの NULL データの正確な値によって異なります。ANY 探索条件の詳細については、ANY 探索条件と SOME 探索条件を参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |