web-dev-qa-db-ja.com

選択ステートメントのケース

私はCASEからの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
129
fadzli feizal

MSDNは、構文や使用法に関するこれらの種類の質問に対する優れた参考資料です。これはTransact SQLリファレンス - ケースページからです。

http://msdn.Microsoft.com/ja-jp/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を使用している場合にチェックアウトしたいと思うもう1つの良いサイトは SQL Server Central です。これには、SQL Serverのどの分野でも習得したいさまざまなリソースがあります。

181
NuNn DaDdY

私はこれらがあなたに役立つかもしれないと思います。

単純な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

ORDER BY節でCASEを使用する

次の例では、ORDER BY節でCASE式を使用して、指定された列値に基づいて行のソート順を決定します。最初の例では、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;

CASEステートメントでUPDATEを使用する

次の例では、CASEステートメントでUPDATE式を使用して、SalariedFlagが0に設定されている従業員の列VacationHoursに設定されている値を判別します。それ以外の場合、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;

これらの例の詳細については source をご覧ください。

また、 here および here をご覧ください。詳細な例がいくつかあります。

71
Sabir Al Fateh

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

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
9
user5035983