天天看點

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 謂詞。