SOME | ANY (Transact-SQL)

Vergleicht einen Skalarwert mit den Werten, die sich in einer einzigen Spalte befinden. SOME und ANY sind identisch.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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

Argumente

  • scalar_expression
    Ein gültiger Ausdruck.

  • { = | <> | != | > | >= | !> | < | <= | !< }
    Ein gültiger Vergleichsoperator.

  • SOME | ANY
    Legt fest, dass ein Vergleich durchgeführt werden soll.

  • subquery
    Eine Unterabfrage mit einem Resultset, das aus einer Spalte besteht. Der Datentyp der zurückgegebenen Spalte muss mit dem Datentyp von scalar_expression übereinstimmen.

Ergebnistypen

Boolean

Ergebniswert

SOME oder ANY gibt TRUE zurück, wenn der angegebene Vergleich für ein beliebiges Paar (scalar_expression**,**x) TRUE ergibt, wobei x ein Wert im einspaltigen Resultset ist. Andernfalls wird FALSE zurückgegeben.

Hinweise

SOME erfordert, dass scalar_expression mit mindestens einem von der Unterabfrage zurückgegebenen Wert positiv verglichen wird. Anweisungen, die erfordern, dass scalar_expression mit jedem von der Unterabfrage zurückgegebenen Wert positiv verglichen wird, finden Sie unter ALL (Transact-SQL). Wenn die Unterabfrage beispielsweise die Werte 2 und 3 zurückgibt, wird scalar_expression = SOME (Unterabfrage) zu TRUE für scalar_express von 2 ausgewertet. Wenn die Unterabfrage die Werte 2 und 3 zurückgibt, wird scalar_expression = ALL (Unterabfrage) zu FALSE ausgewertet, da einige Werte der Unterabfrage (der Wert 3) die Kriterien des Ausdrucks nicht erfüllen.

Beispiele

A. Einfaches Beispiel

Die folgenden Anweisungen erstellen eine einfache Tabelle und fügen der ID-Spalte die Werte 1, 2, 3 und 4 hinzu.

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

Die folgende Abfrage gibt TRUE zurück, da 3 kleiner als einige der Werte in der Tabelle ist.

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

Die folgende Abfrage gibt FALSE zurück, da 3 nicht kleiner als alle Werte in der Tabelle ist.

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

B. Praktisches Beispiel

Im folgenden Beispiel wird eine gespeicherte Prozedur erstellt, die bestimmt, ob alle Komponenten einer angegebenen SalesOrderID in der AdventureWorks-Datenbank innerhalb der angegebenen Anzahl von Tagen gefertigt werden können. Im Beispiel wird eine Unterabfrage verwendet, um eine Liste mit der Anzahl der DaysToManufacture-Werte für alle Komponenten einer bestimmten SalesOrderID zu erstellen. Anschließend wird geprüft, ob einer der von der Unterabfrage zurückgegebenen Werte größer ist als die Anzahl der angegebenen Tage. Wenn jeder Wert von DaysToManufacture, der zurückgegeben wird, kleiner ist als die angegebene Anzahl, ist die Bedingung TRUE, und die erste Meldung wird ausgegeben.

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

Zum Testen der Prozedur führen Sie die Prozedur aus, indem Sie die SalesOrderID49080 verwenden, die über eine Komponente verfügt, die 2 Tage erfordert, und über zwei Komponenten, die 0 Tage erfordern. Die erste im Folgenden genannte Anweisung erfüllt die Kriterien. Die zweite Abfrage erfüllt sie nicht.

EXECUTE ManyDaysToComplete 49080, 2 ;

Dies ist das Resultset.

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

EXECUTE ManyDaysToComplete 49080, 1 ;

Dies ist das Resultset.

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