SOME | ANY (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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

Transact-SQL 構文表記規則

構文

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

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

scalar_expression
任意の有効なを指定します。


有効な比較演算子です。

SOME | ANY

比較を行うことを指定します。

subquery

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

結果の型

Boolean

結果の値

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

解説

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

A. 簡単な例を実行する

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

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

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

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

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

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

B. 実用的な例を実行する

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

-- Uses AdventureWorks

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 can''t 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.' ;

このプロシージャをテストするには、SalesOrderID``49080 を使用してプロシージャを実行します。この注文内容には、必要な日数が 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 can't be manufactured in specified number of days.

関連項目