SOME | ANY (Transact-SQL)

スカラ値を単一列で構成される値のセットと比較します。SOME と ANY は等価です。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

scalar_expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } 
     { SOME | ANY } ( subquery ) 

引数

  • scalar_expression
    任意の有効なです。

  • { = | <> | != | > | >= | !> | < | <= | !< }
    有効な比較演算子です。

  • SOME | ANY
    比較を行うことを指定します。

  • subquery
    1 列の結果セットを返すサブクエリです。返される列のデータ型は、scalar_expression のデータ型と同じであることが必要です。

戻り値の型

Boolean

戻り値

SOME または ANY は、指定された比較が (scalar_expression**,**x) の任意の組で TRUE の場合、TRUE を返します。ここで、x は単一列セットの中の値です。それ以外の場合は、FALSE を返します。

説明

SOME の場合、scalar_expression ではサブクエリによって返される 1 つ以上の値に対し肯定的な比較を行う必要があります。scalar_expression でサブクエリによって返されるすべての値に対し肯定的な比較を行う必要があるステートメントについては、「ALL (Transact-SQL)」を参照してください。たとえば、scalar_express を 2 とすると、サブクエリによって値 2 と 3 が返される場合、scalar_expression = SOME (subquery) は TRUE と評価されます。一方、同じ条件で scalar_expression = ALL (subquery) は FALSE と評価されます。これは、サブクエリによって返される値の一部 (値 3) が式の評価基準に合わないためです。

A. 簡単な例

次のステートメントでは、簡単なテーブルを作成し、ID 列に値 1、2、3、4 を追加します。

CREATE TABLE T1
(ID int) ;
GO
INSERT T1 VALUES (1) ;
INSERT T1 VALUES (2) ;
INSERT T1 VALUES (3) ;
INSERT T1 VALUES (4) ;

テーブルには 3 より大きい値があるため、次のクエリは TRUE を返します。

IF 3 < SOME (SELECT ID FROM T1)
PRINT 'TRUE' 
ELSE
PRINT 'FALSE' ;

3 はテーブル内の値の中で最も小さい値ではないため、次のクエリは FALSE を返します。

IF 3 < ALL (SELECT ID FROM T1)
PRINT 'TRUE' 
ELSE
PRINT 'FALSE' ;

B. 実用的な例

次の例では、ストアド プロシージャを作成し、AdventureWorks データベース内にある指定した SalesOrderID のすべての部品が、指定した日数で製造できるかどうかを判定します。この例では、サブクエリを使用して、特定の SalesOrderID のすべての部品に対する DaysToManufacture の値一覧を作成し、その中に指定した日数よりも大きいものがないかどうか調べます。返された DaysToManufacture のすべての値が指定した数値より小さい場合、条件式は TRUE となり、最初のメッセージが出力されます。

USE AdventureWorks ;
GO

CREATE PROCEDURE ManyDaysToComplete @OrderID int, @NumberOfDays int
AS
IF 
@NumberOfDays < SOME
   (
    SELECT DaysToManufacture
    FROM Sales.SalesOrderDetail
    JOIN Production.Product 
    ON Sales.SalesOrderDetail.ProductID = Production.Product.ProductID 
    WHERE SalesOrderID = @OrderID
   )
PRINT 'At least one item for this order cannot be manufactured in specified number of days.'
ELSE 
PRINT 'All items for this order can be manufactured in the specified number of days or less.' ;

このプロシージャをテストするには、SalesOrderID49080 を使用してプロシージャを実行します。この注文内容には、必要な日数が 2 日の部品が 1 つと 0 日の部品が 2 つが含まれています。次に示す最初のステートメントは条件を満たしますが、2 番目のクエリは条件を満たしません。

EXECUTE ManyDaysToComplete 49080, 2 ;

以下に結果セットを示します。

All items for this order can be manufactured in the specified number of days or less.

EXECUTE ManyDaysToComplete 49080, 1 ;

以下に結果セットを示します。

At least one item for this order cannot be manufactured in specified number of days.