BETWEEN (Transact-SQL)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库

指定测试范围。

Transact-SQL 语法约定

语法

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,则结果为 UNKNOWN。

示例

A. 使用 BETWEEN

以下示例返回有关数据库中数据库角色的信息。 第一个查询返回所有角色。 第二个示例使用 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

下面的示例使用大于 (>) 和小于 (<) 运算符,因为这些运算符是非包含的,所以该示例返回九行,而不是像上一个示例那样返回十行。

-- 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 值介于 '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:00。请注意,此查询不会返回包含 2002 年 1 月 5 日凌晨 12:00 之后的时间部分的行,因为它不在此范围之内。

另请参阅

>(大于)(Transact-SQL)
<(小于)(Transact-SQL)
表达式(Transact-SQL)
内置函数 (Transact-SQL)
运算符 (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)