SQL SELECT で IF…THEN を実行するにはどうすればよいですか?
-
09-06-2019 - |
質問
どうすれば実行できますか 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 ステートメントも利用できます アクセス (からの指摘 マーティン・スミス):
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>
order by 句に case ステートメントを入れて、非常に派手な順序付けを行うこともできます。
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
いくつかの素晴らしい例を見つけることができます SQL CASE ステートメントの力, 、使用できるステートメントは次のようなものになると思います(from ローラからの4人):
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
Microsoft SQL サーバー (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
から このリンク, 、私たちは理解できます 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
CASE ステートメントを使用します。
SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
新しい機能、 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 になります。次回の使用 ビット演算子.
それが一番 ウィシウィグ 方法。
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
質問:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
ANSI:
Select
case when p.Obsolete = 'N'
or p.InStock = 'Y' then 1 else 0 end as Saleable,
p.*
FROM
Product p;
エイリアスの使用 -- p
この場合 -- 問題を防ぐのに役立ちます。
これを実際に実装するには 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
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product