Selectステートメントのケース


141

CASEfrom SELECTを含むSQLステートメントがありますが、正しく理解できません。例を見せてもらえますか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

2つのケースタイプを説明する私の答え 1.単純なCASE式2.検索されたCASE式。また、SELECT、UPDATE、ORDER BYあり、HAVINGクエリでの両方のタイプの大文字と小文字の使い方。
Somnath Muluk

回答:


195

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のどの領域についても学習したいさまざまなリソースが用意されています。


82

これらはあなたに役立つと思います。

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

使用CASEORDER BY

次の例では、句のCASE式を使用ORDER BYして、特定の列の値に基づいて行のソート順を決定しています。最初の例では、HumanResources.EmployeeテーブルのSalariedFlag列の値が評価されます。SalariedFlagが1に設定されている従業員は、BusinessEntityIDによって降順で返されます。SalariedFlagが0に設定されている従業員は、BusinessEntityIDによって昇順で返されます。2番目の例では、列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;

使用CASEUPDATEの文

次の例では、ステートメントのCASE式を使用して、UPDATESalariedFlagが0に設定されている従業員のVacationHours列に設定されている値を決定します。VacationHoursから10時間を減算すると、負の値になります。それ以外の場合、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; 

使用してCASEAに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;

これらの例の詳細については、ソースをご覧ください

また、ここここにアクセスし、詳細な例をいくつか参照してください。


このような詳細な回答を本当に感謝しています。
Aneeq Azam Khan

12

あなたも使うことができます:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.