天天看点

SELECT 查询中的谓词与 CASE 表达式

一、谓词和运算符

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个边界值。

WHERE Rate BETWEEN 1 AND 9

(3)LIKE 谓词

  LIKE 谓词用于检查一个字符串是否满足指定的筛选条件。

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%'

  上例中,为了便于阅读而做了代码缩进。为了提高代码的可读性,建议使用圆括号。上面的查询可以等价于下面的查询。

   ( Customer ID > 100 AND OrderID IN (1,2,3) )

  ( (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

三、三值逻辑

  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 谓词。