BETWEEN (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

テスト範囲を指定します。

Transact-SQL 構文表記規則

構文

test_expression [ NOT ] BETWEEN begin_expression AND end_expression  

Note

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

引数

test_expression
begin_expressionend_expression で定義した範囲内でテストするを指定します。 test_expression のデータ型は、begin_expression および end_expression の両方と同じにする必要があります。

NOT
述語の結果を否定することを指定します。

begin_expression
任意の有効な式です。 begin_expression のデータ型は、test_expression および end_expression の両方と同じにする必要があります。

end_expression
任意の有効な式です。 end_expression のデータ型は、test_expression および begin_expression の両方と同じにする必要があります。

AND
begin_expressionend_expression で表される範囲内で test_expression をテストする必要があることを示すプレースホルダーとして動作します。

戻り値の型

Boolean

結果の値

test_expression の値が begin_expression の値以上で end_expression の値以下の場合、BETWEEN は TRUE を返します。

test_expression の値が begin_expression の値より小さく end_expression の値より大きい場合、NOT BETWEEN は TRUE を返します。

解説

両端を除いた範囲を指定するには、より大きいことを表す演算子 (>) と、より小さいことを表す演算子 (<) を使用します。 BETWEEN または NOT BETWEEN の述語に対する入力が NULL の場合、結果は UNKNOWN になります。

A. BETWEEN を使用する

次の例は、データベース内のデータベース ロールに関する情報を返します。 最初のクエリはすべてのロールを返します。 2 つ目の例では、BETWEEN 句を使用して、指定された database_id 値にロールを制限します。

SELECT principal_id, name 
FROM sys.database_principals
WHERE type = 'R';

SELECT principal_id, name 
FROM sys.database_principals
WHERE type = 'R'
AND principal_id BETWEEN 16385 AND 16390;
GO  

結果セットは次のようになります。

principal_id	name
------------  ---- 
0	            public
16384	        db_owner
16385	        db_accessadmin
16386	        db_securityadmin
16387	        db_ddladmin
16389	        db_backupoperator
16390	        db_datareader
16391	        db_datawriter
16392	        db_denydatareader
16393	        db_denydatawriter
principal_id	name
------------  ---- 
16385	        db_accessadmin
16386	        db_securityadmin
16387	        db_ddladmin
16389	        db_backupoperator
16390	        db_datareader

B. BETWEEN の代わりに > と < を使用する

次の例では、より大きいことを表す演算子 (>) と、より小さいことを表す演算子 (<) を使用します。どちらも両端を含まないため、前の例の 10 行とは異なり、9 行が返されます。

-- Uses AdventureWorks  
  
SELECT e.FirstName, e.LastName, ep.Rate  
FROM HumanResources.vEmployee e   
JOIN HumanResources.EmployeePayHistory ep   
    ON e.BusinessEntityID = ep.BusinessEntityID  
WHERE ep.Rate > 27 AND ep.Rate < 30  
ORDER BY ep.Rate;  
GO  

結果セットは次のようになります。

FirstName   LastName             Rate  
---------   -------------------  ---------  
Paula       Barreto de Mattos    27.1394  
Janaina     Bueno                27.4038  
Dan         Bacon                27.4038  
Ramesh      Meyyappan            27.4038  
Karen       Berg                 27.4038  
David       Bradley              28.7500  
Hazem       Abolrous             28.8462  
Ovidiu      Cracium              28.8462  
Rob         Walters              29.8462  

C. NOT BETWEEN を使用する

次の例では、指定した範囲 2730 に該当しないすべての行を検索します。

-- Uses AdventureWorks  
  
SELECT e.FirstName, e.LastName, ep.Rate  
FROM HumanResources.vEmployee e   
JOIN HumanResources.EmployeePayHistory ep   
    ON e.BusinessEntityID = ep.BusinessEntityID  
WHERE ep.Rate NOT BETWEEN 27 AND 30  
ORDER BY ep.Rate;  
GO  

D. BETWEEN を datetime 値と共に使用する

次の例では、datetime 値が '20011212' から '20020105' までの範囲内にある行を取得します。

-- Uses AdventureWorks  
  
SELECT BusinessEntityID, RateChangeDate  
FROM HumanResources.EmployeePayHistory  
WHERE RateChangeDate BETWEEN '20011212' AND '20020105';  

結果セットは次のようになります。

BusinessEntityID RateChangeDate  
----------- -----------------------  
3           2001-12-12 00:00:00.000  
4           2002-01-05 00:00:00.000  

クエリ内の日付値と RateChangeDate 列の datetime 値は、時刻部分なしで日付が指定されているため、このクエリは予測される行を取得します。 時刻部分を指定しない場合、時刻は既定で午前 12 時になります。時刻部分として 2002 年 1 月 5 日の午前 12 時よりも後の値が格納されている行は範囲外になるため、このクエリでは返されません。

参照

> (より大きい) (Transact-SQL)
< (より小さい) (Transact-SQL)
式 (Transact-SQL)
組み込み関数 (Transact-SQL)
演算子 (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)