Select 语句中的情况

问题描述 投票:0回答:3

我有一个 SQL 语句,其中包含来自

CASE
SELECT
,但我就是无法正确理解。你们能给我看一个
CASE
的例子吗,其中案例是条件,结果来自案例。例如:

     Select xxx, yyy
     case : desc case when bbb then 'blackberry';
     when sss then 'samsung';
     end 
     from (select ???? .....

结果显示

 name                         age       handphone
xxx1                         yyy1      blackberry
xxx2                         yyy2      blackberry
sql sql-server case
3个回答
224
投票

MSDN 是此类有关语法和用法的问题的一个很好的参考。 这是来自 Transact SQL 参考 - CASE 页面。

http://msdn.microsoft.com/en-us/library/ms181765.aspx

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

如果您使用 SQL Server,您可能需要查看的另一个好站点是 SQL Server Central。 这里有大量的资源可供您学习 SQL Server 的任何领域。


102
投票

使用

SELECT
语句和简单的
CASE
表达式

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

SELECT
语句与搜索的
CASE
表达式一起使用

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

CASE
子句中使用
ORDER BY

以下示例在

CASE
子句中使用
ORDER BY
表达式来根据给定的列值确定行的排序顺序。在第一个示例中,计算 HumanResources.Employee 表的 SalariedFlag 列中的值。 SalariedFlag 设置为 1 的员工将按 BusinessEntityID 降序返回。 SalariedFlag 设置为 0 的员工将按 BusinessEntityID 升序返回。在第二个示例中,当列 CountryRegionName 等于“United States”时,结果集按 TerritoryName 列排序,对于所有其他行,结果集按 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


SELECT BusinessEntityID, LastName, TerritoryName, CountryRegionName
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL
ORDER BY CASE CountryRegionName WHEN 'United States' THEN TerritoryName
         ELSE CountryRegionName END;

CASE
语句中使用
UPDATE

以下示例在

CASE
语句中使用
UPDATE
表达式来确定为 SalariedFlag 设置为 0 的员工的 VacationHours 列设置的值。从 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; 

CASE
子句中使用
HAVING

以下示例在

CASE
子句中使用
HAVING
表达式来限制
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;

有关这些示例的更多详细说明,请访问

另请访问此处此处获取一些详细信息的示例。


17
投票

您还可以使用:

SELECT CASE
         WHEN upper(t.name) like 'P%' THEN
          'productive'
         WHEN upper(t.name) like 'T%' THEN
          'test'
         WHEN upper(t.name) like 'D%' THEN
          'development'
         ELSE
          'unknown'
       END as type
FROM table t
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.