ステートメントIF...THEN
でどのように実行しSQL SELECT
ますか?
例えば:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
、適用されCHECK
ませんSELECT
。
ステートメントIF...THEN
でどのように実行しSQL SELECT
ますか?
例えば:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
、適用されCHECK
ませんSELECT
。
回答:
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
ケースステートメントは、この状況での友であり、次の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句に入れて、非常に洗練された順序にすることもできます。
AS Col_Name
後にEND
を追加できることに注意してください
SQL Server 2012以降では、このIIF
機能を使用できます。
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
これは、実質的には(標準SQLではありませんが)省略形の記述方法ですCASE
。
拡張CASE
バージョンと比較すると、簡潔さを好みます。
どちらIIF()
とCASE
SQLステートメント内の表現としての決意とだけ明確に定義された場所で使用することができます。
CASE式を使用して、Transact-SQLステートメント、ステートメントブロック、ユーザー定義関数、およびストアドプロシージャの実行フローを制御することはできません。
これらの制限(たとえば、条件に応じて異なる形状の結果セットを返す必要がある)でニーズを満たせない場合は、SQL Serverにも手続き型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
このリンクから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にはこれで十分ではありませんか?
SQL Serverの単純なif-elseステートメント:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
SQL ServerのネストされたIf ... elseステートメント-
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand.';
ELSE
BEGIN
IF @val < 50
PRINT 'what''s up?';
ELSE
PRINT 'Bye Ravi Anand.';
END;
GO
SELECT
、OPが尋ねたように内部で使用できますか?
新しい機能であるIIF(簡単に使用できる)がSQL Server 2012に追加されました。
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
参照せずに、その後の場合:作業のデモをcase
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 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]
CASE
だったのIF
ではなく、なぜ賛成投票されて答えとしてマークされるのかをたださまよっています。このように、これはまだCASE
ステートメントではなく、IF
です。
あるテーブルから別のテーブルに結果を転送するのではなく、初めてテーブルに結果を挿入する場合、これはOracle 11.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');
CASE
ステートメントの代替ソリューションとして、テーブル駆動アプローチを使用できます。
DECLARE @Product TABLE (ID INT, Obsolete VARCHAR(10), InStock VARCHAR(10))
INSERT INTO @Product VALUES
(1,'N','Y'),
(2,'A','B'),
(3,'N','B'),
(4,'A','Y')
SELECT P.* , ISNULL(Stmt.Saleable,0) Saleable
FROM
@Product P
LEFT JOIN
( VALUES
( 'N', 'Y', 1 )
) Stmt (Obsolete, InStock, Saleable)
ON P.InStock = Stmt.InStock OR P.Obsolete = Stmt.Obsolete
結果:
ID Obsolete InStock Saleable
----------- ---------- ---------- -----------
1 N Y 1
2 A B 0
3 N B 1
4 A Y 1
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0
END AS Saleable, *
FROM Product
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
これを実際に実装するには、2つの選択肢があります。
SQL Server 2012から導入されたIIFの使用:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
使用Select Case
:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
SQL CASEの使用は、通常のIf / Elseステートメントと同じです。以下のクエリでは、廃止された値= 'N'またはIf InStock値= 'Y'の場合、出力は1になります。それ以外の場合、出力は0になります。次に、その0または1の値をSalable列の下に配置します。
SELECT
CASE
WHEN obsolete = 'N' OR InStock = 'Y'
THEN 1
ELSE 0
END AS Salable
, *
FROM PRODUCT
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product
それはそのようなものになります:
SELECT OrderID, Quantity,
CASE
WHEN Quantity > 30 THEN "The quantity is greater than 30"
WHEN Quantity = 30 THEN "The quantity is 30"
ELSE "The quantity is under 30"
END AS QuantityText
FROM OrderDetails;
SELECT OrderID, Quantity, CASE WHEN Quantity > 30 THEN "The quantity is greater than 30" WHEN Quantity = 30 THEN "The quantity is 30" ELSE "The quantity is under 30" END AS QuantityText FROM OrderDetails WHERE QuantityText = 'The quantity is 30';
完全を期すために、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
それがどのように機能するかを理解したら、nullの動作を決定することにより、3つの結果を2つの結果に変換できます。たとえば、これはnullを販売不可能として扱います。
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
ELSE 'false' -- either false or null
END AS saleable
CASEステートメントの使用は好きですが、SQL SelectでIFステートメントを質問しました。私が過去に使用したものは次のとおりです。
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
これは、条件の後に真の条件が続き、次に偽の条件が続くExcelまたはシートのIFステートメントのようなものです。
if(condition, true, false)
さらに、ifステートメントをネストすることができます(ただし、CASEを使用する必要があります:-)
(注:これはMySQLWorkbenchで機能しますが、他のプラットフォームでは機能しない場合があります)