共用方式為


BETWEEN (Transact-SQL)

適用於:MICROSOFT網狀架構 Microsoft倉儲中的 SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse AnalyticsPlatform System (PDW)SQL 分析端點Microsoft網狀架構

指定要測試的範圍。

Transact-SQL 語法慣例

語法

test_expression [ NOT ] BETWEEN begin_expression AND end_expression

引數

test_expression

表示式,以在 begin_expressionend_expression所定義的範圍內測試 。 test_expression 的資料類型必須與 begin_expressionend_expression 相同。

NOT

指定述詞的結果已否定。

begin_expression

任何有效的表達式。 begin_expression 的資料類型必須與 test_expressionend_expression 相同。

end_expression

任何有效的表達式。 end_expression 的資料類型必須與 test_expressionbegin_expression 相同。

AND

用來作為預留位置,表示 test_expression 應該位於 begin_expressionend_expression 所指定的範圍內。

傳回型別

布林值

備註

如果 test_expression 的值大於或等於 begin_expression 的值,且小於或等於 end_expression的值,BETWEEN 會傳回 TRUE

如果 test_expression 的值小於 begin_expression 或大於 end_expression的值,NOT BETWEEN 會傳回 TRUE

若要指定獨佔範圍,請使用大於 (>) 和小於 (<) 運算子。 如果 BETWEENNOT BETWEEN 述詞的任何輸入 NULL,則結果取決於組成部分的結果。

在下列範例 test_expression >= begin_expression AND test_expression <= end_expression中,如果任一部分 FALSE,則整體 BETWEEN 表示式會評估為 FALSE。 否則,表示式會評估為 UNKNOWN

範例

本文中的程式代碼範例會使用 AdventureWorks2022AdventureWorksDW2022 範例資料庫,您可以從 Microsoft SQL Server 範例和社群專案 首頁下載。

A. 使用 BETWEEN

下列範例會傳回資料庫中資料庫角色的相關資訊。 第一個查詢會傳回所有角色。 第二個範例會使用 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 個數據列。

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 值介於 2001121220020105 (含) 之間的資料列。

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

查詢會擷取預期的數據列,因為查詢中的日期值和 datetime 儲存在 RateChangeDate 數據行中的值會指定,而不會指定日期的時間部分。 未指定時間部分時,預設為上午 12:00。包含 2002 年 1 月 5 日上午 12:00 之後之時間部分的數據列不會由此查詢傳回,因為它落在範圍之外。