BETWEEN (Transact-SQL)

Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス

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

Transact-SQL 構文表記規則

構文

test_expression [ NOT ] BETWEEN begin_expression AND end_expression  

引数

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)