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 のウェアハウス
テスト範囲を指定します。
構文
test_expression [ NOT ] BETWEEN begin_expression AND end_expression
引数
test_expression
begin_expression と end_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_expression と end_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 を使用する
次の例では、指定した範囲 27
~ 30
に該当しないすべての行を検索します。
-- 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)