ステートメントで を実行するIF...THEN
にはどうすればよいですか?SQL SELECT
例えば:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
ステートメントで を実行するIF...THEN
にはどうすればよいですか?SQL SELECT
例えば:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
このCASE
ステートメントは SQL の IF に最も近く、SQL Server のすべてのバージョンでサポートされています。
SELECT CAST(
CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END AS bit) as Saleable, *
FROM Product
CAST
結果をブール値として取得する場合にのみ、演算子を使用する必要があります。に満足している場合int
、これは機能します:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
CASE
ステートメントは他のステートメントに埋め込むことができCASE
、集計に含めることもできます。
SQL Server Denali (SQL Server 2012) は、アクセスでも利用できるIIFステートメントを追加します ( Martin Smithが指摘):
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
この状況では、case ステートメントが役に立ち、次の 2 つの形式のいずれかを取ります。
単純なケース:
SELECT CASE <variable> WHEN <value> THEN <returnvalue>
WHEN <othervalue> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
拡張されたケース:
SELECT CASE WHEN <test> THEN <returnvalue>
WHEN <othertest> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
非常に洗練された順序付けのために、case ステートメントを order by 句に入れることもできます。
IIF
SQL Server 2012から、この機能を使用できます。
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
これは事実上、(標準のSQLではありませんが)簡単な記述方法ですCASE
。
CASE
拡張版と比べると簡潔さが好きです。
IIF()
とはCASE
SQLステートメント内の式として解決され、明確に定義された場所でのみ使用できます。
CASE式を使用して、Transact-SQLステートメント、ステートメントブロック、ユーザー定義関数、およびストアドプロシージャの実行フローを制御することはできません。
これらの制限によってニーズを満たすことができない場合(たとえば、条件に応じて異なる形状の結果セットを返す必要がある場合)、SQLServerには手続き型IF
キーワードもあります。
IF @IncludeExtendedInformation = 1
BEGIN
SELECT A,B,C,X,Y,Z
FROM T
END
ELSE
BEGIN
SELECT A,B,C
FROM T
END
The Power of SQL CASE Statementsでいくつかの良い例を見つけることができます。使用できるステートメントは次のようなものになると思います ( 4guysfromrollaから):
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
使用事例。このようなもの。
SELECT Salable =
CASE Obsolete
WHEN 'N' THEN 1
ELSE 0
END
SELECT
(CASE
WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
ELSE 'NO'
END) as Salable
, *
FROM Product
このリンクからIF THEN ELSE
、T-SQLで理解できます。
IF EXISTS(SELECT *
FROM Northwind.dbo.Customers
WHERE CustomerId = 'ALFKI')
PRINT 'Need to update Customer Record ALFKI'
ELSE
PRINT 'Need to add Customer Record ALFKI'
IF EXISTS(SELECT *
FROM Northwind.dbo.Customers
WHERE CustomerId = 'LARSE')
PRINT 'Need to update Customer Record LARSE'
ELSE
PRINT 'Need to add Customer Record LARSE'
これはT-SQLには十分ではありませんか?
Microsoft SQL Server (T-SQL)
では、select
次を使用します。
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
where
句では、次を使用します。
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
CASE ステートメントを使用します。
SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
SQL Server 2012 では、 IIF (簡単に使用できる) という新しい機能が追加されました。
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
純粋なビット ロジックを使用します。
DECLARE @Product TABLE (
id INT PRIMARY KEY IDENTITY NOT NULL
,Obsolote CHAR(1)
,Instock CHAR(1)
)
INSERT INTO @Product ([Obsolote], [Instock])
VALUES ('N', 'N'), ('N', 'Y'), ('Y', 'Y'), ('Y', 'N')
;
WITH cte
AS
(
SELECT
'CheckIfInstock' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Instock], 'Y'), 1), 'N'), 0) AS BIT)
,'CheckIfObsolote' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Obsolote], 'N'), 0), 'Y'), 1) AS BIT)
,*
FROM
@Product AS p
)
SELECT
'Salable' = c.[CheckIfInstock] & ~c.[CheckIfObsolote]
,*
FROM
[cte] c
動作デモを参照してください: if then without case
in SQL Server。
まず、選択した条件のtrue
との値を計算する必要があります。false
ここに 2 つのNULLIFがあります。
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
組み合わせると 1 または 0 になります。次に、ビット単位の演算子を使用します。
これは最もWYSIWYGな方法です。
SELECT 1 AS Saleable, *
FROM @Product
WHERE ( Obsolete = 'N' OR InStock = 'Y' )
UNION
SELECT 0 AS Saleable, *
FROM @Product
WHERE NOT ( Obsolete = 'N' OR InStock = 'Y' )
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
case statement some what similar to if in SQL server
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
これは答えではなく、私が働いている場所で使用されている CASE ステートメントの例にすぎません。ネストされた CASE ステートメントがあります。私の目が交差している理由がわかりました。
CASE orweb2.dbo.Inventory.RegulatingAgencyName
WHEN 'Region 1'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
WHEN 'Region 2'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
WHEN 'Region 3'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
WHEN 'DEPT OF AGRICULTURE'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactAg
ELSE (
CASE orweb2.dbo.CountyStateAgContactInfo.IsContract
WHEN 1
THEN orweb2.dbo.CountyStateAgContactInfo.ContactCounty
ELSE orweb2.dbo.CountyStateAgContactInfo.ContactState
END
)
END AS [County Contact Name]
あるテーブルから別のテーブルに結果を転送するのではなく、初めて結果をテーブルに挿入する場合、これはOracle11.2gで機能します。
INSERT INTO customers (last_name, first_name, city)
SELECT 'Doe', 'John', 'Chicago' FROM dual
WHERE NOT EXISTS
(SELECT '1' from customers
where last_name = 'Doe'
and first_name = 'John'
and city = 'Chicago');
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0
END AS Saleable, *
FROM Product
SQL Server 2012 を使用している場合、IIF は追加された機能であり、Case ステートメントの代わりとして機能します。
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
SELECT
if((obsolete = 'N' OR instock = 'Y'), 1, 0) AS saleable, *
FROM
product;
CASE ステートメントの使用は気に入っていますが、SQL Select で IF ステートメントを使用するように求められました。私が過去に使用したものは次のとおりです。
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
これは、条件式の後に真の条件が続き、次に偽の条件がある Excel またはシートの IF ステートメントのようなものです。
if(condition, true, false)
さらに、if ステートメントをネストできます (ただし、use は CASE を使用する必要があります :-)
(注: これは MySQLWorkbench では機能しますが、他のプラットフォームでは機能しない可能性があります)
完全を期すために、SQL は 3 値ロジックを使用していることを付け加えておきます。表現:
obsolete = 'N' OR instock = 'Y'
次の 3 つの異なる結果が生成される可能性があります。
| obsolete | instock | saleable |
|----------|---------|----------|
| Y | Y | true |
| Y | N | false |
| Y | null | null |
| N | Y | true |
| N | N | true |
| N | null | true |
| null | Y | true |
| null | N | null |
| null | null | null |
たとえば、製品が廃止されたが、製品の在庫があるかどうかがわからない場合、製品が販売可能かどうかはわかりません。この 3 つの値を持つロジックは、次のように記述できます。
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
ELSE NULL
END AS saleable
仕組みがわかれば、ヌルの振る舞いを決めることで、3つの結果を2つの結果に変換できます。たとえば、これは null を販売不可として扱います。
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
ELSE 'false' -- either false or null
END AS saleable