2013-01-07 17 views
99

からSELECTまでのSQLステートメントがありますが、それは正しくできません。皆さんは私にCASEという例を表示できますか?ケースは条件であり、結果はケースからのものです。例:結果はSelectステートメントでのケース

name       age  handphone 
xxx1       yyy1  blackberry 
xxx2       yyy2  blackberry 
+0

2つのケースの種類を説明する[私の答え](http://stackoverflow.com/a/38874485/1045444)1.単純なケースの式2.検索されたケースの式。また、両方の型のケースの使用法は、SELECT、UPDATE、ORDER BY、HAVINGクエリを使用します。 –

答えて

148

を見せる

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

MSDNには、構文と使用方法に関する質問のこれらのタイプのために良いリファレンスです。これはTransact SQL Reference - 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のどの領域でも利用可能な多種多様なリソースがあります。

6

あなたも使用することができます。

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 
51

私はこれらがあなたのために役立つことができると思い。シンプルCASE表現SELECT声明の中で

、シンプルCASE式は唯一の等価性チェックを可能とSELECTステートメントを使用して

。他の比較は行われない。次の例では、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 

、検索CASE発現SELECTステートメント内

SELECTステートメントを使用して値が比較値に基づいて結果セットに交換する検索CASE発現が可能となります。次の例では、製品の価格帯に基づいてテキストのコメントとして価格を表示します。以下の実施例ORDER BY句で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 

は、与えられた列の値に基づいて行のソート順を決定するORDER BY句でCASE式を使用。最初の例では、HumanResources.EmployeeテーブルのSalariedFlagカラムの値が評価されます。 SalariedFlagが1に設定されている従業員は、BusinessEntityIDによって降順で順番に返されます。 SalariedFlagが0に設定されている従業員は、BusinessEntityIDによって昇順で順番に返されます。 2番目の例では、CountryRegionName列が 'United States'列で、他のすべての列でCountryRegionName列の場合、結果セットは列TerritoryNameによって順序付けられます。

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; 
UPDATEステートメントでCASEを使用

次の例では、0場合にSalariedFlagが設定された従業員の列VacationHoursに設定された値を決定するために、UPDATE文でCASE式を使用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; 
HAVING句でCASEを使用して

次の例では、SELECTステートメントによって返される行を制限するためにHAVING句でCASE式を使用しています。このステートメントは、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; 

これらの例の詳細については、sourceを参照してください。

詳細については、herehereもご覧ください。

関連する問題