本文共 2741 字,大约阅读时间需要 9 分钟。
一、谓词和运算符
1. 谓词
谓词是计算结果为逻辑值(为:TRUE、FALSE、UNKNOWN)的逻辑表达式。
在 SELECT 查询中,在 WHERE 子句和 HAVING 子句中可以为筛选指定谓词。在其它需要返回结果为逻辑值的表达式中(例如,在 FROM 子句的联接条件中、在 CHECK 约束中)都可以指定谓词。
T-SQL 主要有以下3个谓词。
(1) IN 谓词
IN 谓词用于检查某个值或者某个表达式是否属于一个集合。
SELECT FirstName, p.LastName FROM Person WHERE FirstName IN ('Jim', 'Jimmy', 'James') |
(2)BETWEEN 谓词
BETWEEN 谓词用于检查某个值是否在指定的范围内。BETWEEN 谓词需要指定2个边界值。
SELECT FirstName, p.LastName FROM Person WHERE Rate BETWEEN 1 AND 9 |
(3)LIKE 谓词
LIKE 谓词用于检查一个字符串是否满足指定的筛选条件。
SELECT FirstName, p.LastName FROM Person WHERE FirstName LIKE 'Jim%' |
2. 谓词的连接
可以使用逻辑运算符来连接谓词(即将多个筛选条件连接起来),如 AND 和 OR。如果需要否定一个表达式,可以使用 NOT 运算符。还可以使用圆括号。
请注意 SQL Server 的运算符优先级规则:圆括号的优先级最高,NOT 的优先级其次, AND 的优先级再次,最低的是 OR 的优先级。
下面是一个支持谓词的例子:
SELECT OrderID from Orders WHERE Customer ID > 100 AND OrderID IN (1,2,3) OR OrderDate BETWEEN '20130101' AND '20131231' AND NOT CustomerName LIKE 'A%' |
上例中,为了便于阅读而做了代码缩进。为了提高代码的可读性,建议使用圆括号。上面的查询可以等价于下面的查询。
SELECT OrderID from Orders WHERE ( Customer ID > 100 AND OrderID IN (1,2,3) ) OR ( (OrderDate BETWEEN '20130101' AND '20131231') AND (NOT CustomerName LIKE 'A%')) |
二、CASE表达式
CASE表达式返回一个基于条件逻辑的值。
CASE的语法有两种:简单表达式、搜索表达式。这两种格式都支持可选的 ELSE 参数。
1. 简单表达式
CASE 简单表达式只在一个可能值的列表中进行等同性检查,返回第一个匹配的值,而不进行其他比较。如果列表中没有任何值等同于测试值,CASE简单表达式则返回ELSE子句中的值;如果没有ELSE子句,则默认返回NULL。
SELECT ProductNumber, Category = CASE ProductLine WHEN 'R' THEN 'Road' WHEN 'M' THEN 'Mountain' WHEN 'T' THEN 'Touring' WHEN 'S' THEN 'Other sale items' ELSE 'Not for sale' END, Name FROM Production.Product ORDER BY ProductNumber |
2. 搜索表达式
CASE 搜索表达式允许根据比较值替换结果集中的值。这种格式非常灵活,可以使用谓词和逻辑表达式,而不是简单的等同性检查。
每一个CASE简单表达式都可以转换为CASE搜索表达式;反之则不一定。
SELECT ProductNumber, Name, "Price Range" = CASE WHEN ListPrice = 0 THEN 'Mfg item - not for resale' WHEN ListPrice < 50 THEN 'Under $50' WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250' WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000' ELSE 'Over $1000' END FROM Production.Product ORDER BY ProductNumber |
三、三值逻辑
SQL Server 支持用于表示空值的 NULL,并使用三值逻辑,即谓词的逻辑的计算结果为:TRUE、FALSE、UNKNOWN。
如果逻辑表达式仅仅涉及确定的现值,其计算结果为 TRUE 或 TRUE,即二值逻辑。如果逻辑表达式还涉及空值时,计算结果为 UNKNOWN。
UNKNOWN 的理解容易混乱,因此可能会导致未获得期望的查询结果。
1. NULL 的逻辑判断
如果需要判断某个值是否为 NULL,不可以使用“=”(等号),否则将返回一个空的集合(不会返回任何记录)。例如返回空的集合:WHERE CustomerName = NULL
只能借助谓词 IS NULL 和 IS NOT NULL 实现。例如:WHERE CustomerName IS NOT NULL。
2. NULL与确定值的判断
如果接受TRUE,则FALSE和NULL都将被筛选掉。如果否定TRUE,仍然会将NULL值筛选掉。例如,以下两个例子都将排除NULL值:
WHERE OrderID > 1
WHERE CustomerID <> 'A'
3. NULL与NULL值的判断
即使两个值都为 NULL,那么这两个值的比较结果仍为 UNKNOWN。
4. 特例:NULL 值等于另一个 NULL 值
为了查询的方便,SQL Server 在下列情况下视为 NULL 值等于另一个 NULL 值。
(1) 在分组时,两个NULL值被视为相等。
(2) 在排序时,所有的NULL值被排在相邻的位置。
四、其它说明
1. 在子查询中还有 EXISTS 谓词。
2. 在查询全文索引时,还有 CONTAINS 谓词和 FREETEXT 谓词。
3. 包含 IS NULL 和 IS NOT NULL 的表达式也是谓词。
转载地址:http://eiima.baihongyu.com/