BETWEEN (Transact-SQL)
適用於:MICROSOFT網
狀架構 Microsoft
倉儲中的 SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
Azure Synapse Analytics
Platform System (PDW)SQL 分析端點Microsoft網狀架構
指定要測試的範圍。
語法
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
用來作為預留位置,表示 test_expression 應該位於 begin_expression 和 end_expression 所指定的範圍內。
傳回型別
布林值
備註
如果 test_expression 的值大於或等於 begin_expression 的值,且小於或等於 end_expression的值,BETWEEN
會傳回 TRUE
。
如果 test_expression 的值小於 begin_expression 或大於 end_expression的值,NOT BETWEEN
會傳回 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
下列範例會傳回資料庫中資料庫角色的相關資訊。 第一個查詢會傳回所有角色。 第二個範例會使用 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
下列範例會找出不在指定範圍 27
到 30
之間的所有資料列。
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
查詢會擷取預期的數據列,因為查詢中的日期值和 datetime 儲存在 RateChangeDate
數據行中的值會指定,而不會指定日期的時間部分。 未指定時間部分時,預設為上午 12:00。包含 2002 年 1 月 5 日上午 12:00 之後之時間部分的數據列不會由此查詢傳回,因為它落在範圍之外。