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

时间: 2024-08-25 23:10:49

CASE (Transact-SQL)的相关文章

Transact—SQL

T-SQL是Microsoft公司在关系型数据库管理系统SQL Server中的SQL-3标准的实现,是微软对SQL的扩展,具有SQL的主要特点,同时增加了变量.运算符.函数.流程控制和注释等语言元素,使得其功能更加强大.T-SQL对SQL Server 十分重要,SQL Server中使用图形界面能够完成的所有功能,都可以利用T-SQL来实现.使用T-SQL操作时,与SQL Server通信的所有应用程序都通过向服务器发送T-SQL语句来进行,而与应用程序的界面无关. 根据其完成的具体功能,可

[case分享]SQL 2014 重建AlwaysOn出现AlwaysOn组名已存在

环境:1台 DC+2台SQL 2014 故障: 在AlwaysOn向导,出现这样的错误信息: 解决方法: 1.此情况一般出现误操作的情况,正常的在SQL管理台删除AlwaysOn组不会出现此情况(不能说百分百,按照微软官方删除就不会出现),如果你是在群集删除AlwaysOn组就会出现这种情况. 2.根据信息,先看一下群集是否遗漏之前的旧记录,包括AD域内是否有AlwaysOn组名的计算机.A记录信息. 3.在注册表[HKEY_LOCAL_MACHINE\Cluster\HadrAgNameToI

通往t - sql的阶梯:超越基本级别6:使用CASE表达式和IIF函数

摘要:此文章转自: http://www.sqlservercentral.com/articles/Stairway+Series/108723/ Stairway to T-SQL: Beyond The Basics Level 6: Using the CASE Expression and IIF Function 通往t - sql的阶梯:超越基本级别6:使用CASE表达式和IIF函数 By Gregory Larsen, 2016/04/20 (first published: 2

SQL中的CASE的用法

CASE在SQL语句中,很有点类似java等高级编程语言中的switch这样子的多分枝语句,但是有点不同的是,case后面接的是when,另外,when的后续分枝有点类似if后面接else.这个是我的个人认识,case ..when..then..[else].. 下面,看看MySQL的帮助信息,可以看到case的基本语法结构: 1 topics: #CASE的两种基本用法 2 CASE OPERATOR 3 CASE STATEMENT 4 5 MariaDB [mysql]> help ca

SQL Server数据库学习总结

经过一段时间的学习,也对数据库有了一些认识,数据库基本是由表,关系,操作组成:对于初学者首先要学的 一图胜"十"言:SQL Server 数据库总结 一个大概的总结 经过一段时间的学习,也对数据库有了一些认识.  数据库基本是由表,关系,操作组成:对于初学者首先要学的:  1.数据库是如何存储数据的  表,约束,触发器  2.数据库是如何操作数据的  insert,update,delete T-sql 函数 存储过程 触发器  3.数据库是如何显示数据的  select SQLSer

SQL知识点

1.数据库是如何存储数据的  表,约束,触发器  2.数据库是如何操作数据的  insert,update,delete T-sql 函数 存储过程 触发器  3.数据库是如何显示数据的  select SQLServer数据库学习总结 1.SQL基础  SQL Server2000安装.配置,服务器启动.停止,企业管理器.查询分析器  第一代数据库--网状数据库和层次数据库:第二代数据库--关系数据库  数据库(DB):数据库管理系统(DBMS):数据库系统(DBS)  SQL Server

操作SQL Server的帮助类

可作为以后开发的参考代码,也可以再整理下,代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using System.Data; using System.Configuration; using System.Windows.Forms; namespace test1 { class DataBase

SQL SERVER 简介及应用 - 数据库系统原理

SQL SERVER 是一个分布式的关系型数据库管理系统(RDBMS),具有客户 - 服务器体系结构,一般发行的版本有企业版.标准版.个人版.开发版. SQL SERVER 提供的服务 MS SQL Server:运行 SQL Server 的服务. SQL Server Agent:管理 SQL Server 周期性行为的安排,并在发生错误时通知系统管理员. Microsoft Server Service:提供一个全文本索引和搜索引擎. MS DTC:管理包含不同数据源的事务. SQL SE

『SQL注入』 User-Agent 手工注入的探测与利用分析

原理很简单:后台在接收UA时没有对UA做过滤,也没有PDO进行数据交互(实际PDO是非常有必要的),导致UA中有恶意代码,最终在数据库中执行. Bug 代码: 本地顺手打了一个环境,Bug 代码部分: // 保存到访者的IP信息 $db=DBConnect(); $tbLog=$db->tbPrefix.'log'; $executeArr=array('ip'=>($_SERVER["HTTP_VIA"])?$_SERVER["HTTP_X_FORWARDED_

select case when if 的一些用法

概述:sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作. 首先,让我们看一下CASE的语法.在一般的SELECT中,其语法格式如下: CASE   <单值表达式>        WHEN <表达式值> THEN <SQL语句或者返回值>        WHEN <表达式值> THEN <SQL语句或者返回值>        ...        WHEN <表