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)は access :で利用可能な _ iif _ ステートメントを追加しています( Martin Smith が指摘)
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
Case文はこの状況であなたの友人であり、そして2つの形式のうちの1つを取ります:
簡単な例:
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句に入れて、本当に素敵な順序にすることもできます。
SQL Server 2012以降では、 IIF
function を使用できます。
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
これは事実上CASE
を書くための(標準的なSQLではないにしても)単に簡略化された方法です。
拡張された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
SQLのCASE文の威力にいくつかの良い例があります、そしてあなたが使うことができる文はこのようになると思います( 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
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
この link から、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 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
SQL Serverの単純なif-elseステートメント
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
SQLサーバー内の入れ子になった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
SQL Server 2012では、新しい機能 _ of _ (簡単に使用できます)が追加されました。
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
実用的なデモを参照してください:MSSQLのケースがなければ
まず始めに、選択した条件に対してtrue
とfalse
の値を計算する必要があります。これが2つ来る _ nullif _ :
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
一緒に結合すると1または0になります。次に ビット演算子 を使用します。
それが最も _ wysiwyg _ の方法です。
CASE文を使用します。
SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
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]
あるテーブルから別のテーブルに結果を転送するのではなく、初めてテーブルに結果を挿入する場合、これは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
SQL Server 2012を使用するユーザーにとって、IIFは追加された機能であり、Caseステートメントの代わりとして機能します。
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
販売可能としてCASTを選択(廃止= 'N'またはInStock = 'Y'の場合はCASE WHERE = 0)
これを実際に実装するには、2つの選択肢があります。
1)SQL 2012から導入されたIIFを使用します。
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
2)Select Caseを使う
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
質問... SELECT IF(廃止= 'N' OR InStock = 'Y'?1:0)AS販売可能、* FROM製品から
ANSI:p.Obsolete = 'N'またはp.InStock = 'Y'の場合は大文字と小文字を選択し、1またはそれ以外の場合0は販売可能として終了します。
エイリアス(この場合はp)を使用すると、問題を防ぐのに役立ちます。