次の方法で共有


BETWEEN (Transact-SQL)

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

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

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

解説

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

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

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

次の test_expression >= begin_expression AND test_expression <= end_expression例では、いずれかの部分が FALSE されている場合、BETWEEN 式全体が FALSEに評価されます。 それ以外の場合、式は UNKNOWNに評価されます。

この記事のコード サンプルでは、AdventureWorks2022 または AdventureWorksDW2022 サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクト ホーム ページからダウンロードできます。

A. BETWEEN を使用する

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

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

結果セットは次のとおりです。

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
SELECT principal_id,
       name
FROM sys.database_principals
WHERE type = 'R'
      AND principal_id BETWEEN 16385 AND 16390;
GO

結果セットは次のとおりです。

principal_id name
------------  ----
16385         db_accessadmin
16386         db_securityadmin
16387         db_ddladmin
16389         db_backupoperator
16390         db_datareader

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

次の例では、より大きい (>) およびより小さい (<) 演算子を使用します。これらの演算子は含まれていないため、前の例で返された 10 行ではなく 9 行を返します。

SELECT e.FirstName,
       e.LastName,
       ep.Rate
FROM HumanResources.vEmployee AS e
     INNER JOIN HumanResources.EmployeePayHistory AS 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 に該当しないすべての行を検索します。

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

D. DATETIME 値で BETWEEN を使用する

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

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 時 00 分より後の時刻部分を含む行は、範囲外であるため、このクエリによって返されません。