私は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
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のどの分野でも習得したいさまざまなリソースがあります。
私はこれらがあなたに役立つかもしれないと思います。
単純な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 をご覧ください。
あなたも使用することができます:
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