zoukankan      html  css  js  c++  java
  • CASE (Transact-SQL)

    A. 使用带有 CASE 简单表达式的 SELECT 语句
    Using a SELECT statement with a simple CASE expression
    在 SELECT 语句中,CASE 简单表达式只能用于等同性检查,而不进行其他比较。 下面的示例使用 CASE 表达式更改产品系列类别的显示,以使这些类别更易于理解。

    USE AdventureWorks2012;
    GO
    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;
    GO

    B. 使用带有 CASE 搜索表达式的 SELECT 语句
    在 SELECT 语句中,CASE 搜索表达式允许根据比较值替换结果集中的值。 下面的示例根据产品的价格范围将标价显示为文本注释。

    USE AdventureWorks2012;  
    GO  
    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 ;  
    GO  

    C. 在 ORDER BY 子句中使用 CASE
    下面的示例在 ORDER BY 子句中使用 CASE 表达式,以根据给定的列值确定行的排序顺序。
    The following examples uses the CASE expression in an ORDER BY clause to determine the sort order of the rows based on a given column value.
    在第一个示例中,会计算 SalariedFlag 表中 HumanResources.Employee 列的值。 SalariedFlag 设置为 1 的员工将按 BusinessEntityID 以降序顺序返回。 SalariedFlag 设置为 0 的员工将按 BusinessEntityID 以升序顺序返回。 在第二个示例中,当 TerritoryName 列等于“United States”时,结果集会按 CountryRegionName 列排序,对于所有其他行则按 CountryRegionName 排序。

    SELECT BusinessEntityID, SalariedFlag
    FROM HumanResources.Employee
    ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
    ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;
    GO

    D. 在 UPDATE 语句中使用 CASE
    下面的示例在 UPDATE 语句中使用 CASE 表达式,以确定为 VacationHours 设置为 0 的员工的 SalariedFlag 列所设置的值。 如果 VacationHours 减去 10 小时后会得到一个负值,则 VacationHours 将增加 40 小时;否则 VacationHours 将增加 20 小时。 OUTPUT 子句用于显示前后的休假时间值。

    USE AdventureWorks2012;
    GO
    UPDATE HumanResources.Employee
    SET VacationHours =
    ( CASE
    WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
    ELSE (VacationHours + 20.00)
    END
    )
    OUTPUT Deleted.BusinessEntityID, Deleted.VacationHours AS BeforeValue,
    Inserted.VacationHours AS AfterValue
    WHERE SalariedFlag = 0;

    E. 在 SET 语句中使用 CASE
    下面的示例在表值函数 dbo.GetContactInfo 中的 SET 语句中使用 CASE 表达式。 在 AdventureWorks2012 数据库中,与人员有关的所有数据都存储在 Person.Person 表中。 例如,人员可能是一名员工、 供应商代表或客户。 该函数将返回的第一个和最后一个名称给定BusinessEntityID和该用户的联系人类型。SET 语句中的 CASE 表达式确定要显示的列的值ContactType基于是否存在BusinessEntityID中的列Employee, Vendor,或Customer表。

    USE AdventureWorks2012;
    GO
    CREATE FUNCTION dbo.GetContactInformation(@BusinessEntityID int)
    RETURNS @retContactInformation TABLE
    (
    BusinessEntityID int NOT NULL,
    FirstName nvarchar(50) NULL,
    LastName nvarchar(50) NULL,
    ContactType nvarchar(50) NULL,
    PRIMARY KEY CLUSTERED (BusinessEntityID ASC)
    )
    AS
    -- Returns the first name, last name and contact type for the specified contact.
    BEGIN
    DECLARE
    @FirstName nvarchar(50),
    @LastName nvarchar(50),
    @ContactType nvarchar(50);

    -- Get common contact information
    SELECT
    @BusinessEntityID = BusinessEntityID,
    @FirstName = FirstName,
    @LastName = LastName
    FROM Person.Person
    WHERE BusinessEntityID = @BusinessEntityID;

    SET @ContactType =
    CASE
    -- Check for employee
    WHEN EXISTS(SELECT * FROM HumanResources.Employee AS e
    WHERE e.BusinessEntityID = @BusinessEntityID)
    THEN 'Employee'

    -- Check for vendor
    WHEN EXISTS(SELECT * FROM Person.BusinessEntityContact AS bec
    WHERE bec.BusinessEntityID = @BusinessEntityID)
    THEN 'Vendor'

    -- Check for store
    WHEN EXISTS(SELECT * FROM Purchasing.Vendor AS v
    WHERE v.BusinessEntityID = @BusinessEntityID)
    THEN 'Store Contact'

    -- Check for individual consumer
    WHEN EXISTS(SELECT * FROM Sales.Customer AS c
    WHERE c.PersonID = @BusinessEntityID)
    THEN 'Consumer'
    END;

    -- Return the information to the caller
    IF @BusinessEntityID IS NOT NULL
    BEGIN
    INSERT @retContactInformation
    SELECT @BusinessEntityID, @FirstName, @LastName, @ContactType;
    END;

    RETURN;
    END;
    GO

    SELECT BusinessEntityID, FirstName, LastName, ContactType
    FROM dbo.GetContactInformation(2200);
    GO
    SELECT BusinessEntityID, FirstName, LastName, ContactType
    FROM dbo.GetContactInformation(5);

    F. 在 HAVING 子句中使用 CASE
    下面的示例在 HAVING 子句中使用 CASE 表达式,以限制由 SELECT 语句返回的行。 该语句返回为每个作业标题中的最大每小时速率HumanResources.Employee表。 HAVING 子句将职位限制为两类员工:一是最高每小时薪金超过 40 美元的男性员工,二是最高每小时薪金超过 42 美元的女性员工。

    USE AdventureWorks2012;  
    GO  
    SELECT JobTitle, MAX(ph1.Rate)AS MaximumRate  
    FROM HumanResources.Employee AS e  
    JOIN HumanResources.EmployeePayHistory AS ph1 ON e.BusinessEntityID = ph1.BusinessEntityID  
    GROUP BY JobTitle  
    HAVING (MAX(CASE WHEN Gender = 'M'   
            THEN ph1.Rate   
            ELSE NULL END) > 40.00  
         OR MAX(CASE WHEN Gender  = 'F'   
            THEN ph1.Rate    
            ELSE NULL END) > 42.00)  
    ORDER BY MaximumRate DESC;  

    G. SELECT 语句使用 CASE 表达式
    Using a SELECT statement with a CASE expression
    SELECT 语句中 CASE 表达式允许在结果集中比较值为基础的替换值。 下面的示例使用 CASE 表达式来更改显示的产品行类别,以使它们更易于理解。 不存在一个值时,文本"不能为销售会显示。

    -- Uses AdventureWorks

    SELECT ProductAlternateKey, 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,
    EnglishProductName
    FROM dbo.DimProduct
    ORDER BY ProductKey;

    H. 在 UPDATE 语句中使用 CASE
    下面的示例在 UPDATE 语句中使用 CASE 表达式,以确定为 VacationHours 设置为 0 的员工的 SalariedFlag 列所设置的值。 如果 VacationHours 减去 10 小时后会得到一个负值,则 VacationHours 将增加 40 小时;否则 VacationHours 将增加 20 小时。

    -- Uses AdventureWorks

    UPDATE dbo.DimEmployee
    SET VacationHours =
    ( CASE
    WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
    ELSE (VacationHours + 20.00)
    END
    )
    WHERE SalariedFlag = 0;

    来源:https://msdn.microsoft.com/zh-cn/library/ms181765.aspx

  • 相关阅读:
    三范式
    解决Linux下乱码
    ER概念模型
    20140607
    PHP Fatal error: Class 'Yaf_Application' not found
    PHP流式读取XML文件
    php反射的使用
    wget 和curl 进行post数据
    crontab
    Leetcode OJ: Gray Code
  • 原文地址:https://www.cnblogs.com/railgunman/p/6659516.html
Copyright © 2011-2022 走看看