Wie führe ich einen IF...THEN
in einer SQL SELECT
-Anweisung aus?
Zum Beispiel:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Die CASE
-Anweisung ist der IF in SQL am nächsten und wird in allen SQL Server-Versionen unterstützt
SELECT CAST(
CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END AS bit) as Saleable, *
FROM Product
Sie müssen nur die Variable CAST
ausführen, wenn das Ergebnis als boolescher Wert angezeigt werden soll. Wenn Sie mit einer Variable int
zufrieden sind, funktioniert dies:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
CASE
-Anweisungen können in andere CASE
-Anweisungen eingebettet und sogar in Aggregate eingeschlossen werden.
SQL Server Denali (SQL Server 2012) fügt die Anweisung IIF hinzu, die auch in access : verfügbar ist (unter Hinweis auf Martin Smith ).
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
Die Fallaussage ist Ihr Freund in dieser Situation und hat eine von zwei Formen:
Der einfache Fall:
SELECT CASE <variable> WHEN <value> THEN <returnvalue>
WHEN <othervalue> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Der erweiterte Fall:
SELECT CASE WHEN <test> THEN <returnvalue>
WHEN <othertest> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Sie können sogar case-Anweisungen in eine order by-Klausel setzen, um wirklich ausgefallene Bestellungen zu treffen.
Ab SQL Server 2012 können Sie dazu die Funktion IIF
verwenden.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Dies ist effektiv nur eine Kurzform (wenn auch nicht Standard-SQL), um CASE
zu schreiben.
Ich bevorzuge die Prägnanz gegenüber der erweiterten CASE
-Version.
Sowohl IIF()
als auch CASE
werden als Ausdrücke in einer SQL-Anweisung aufgelöst und können nur an genau definierten Stellen verwendet werden.
Der CASE-Ausdruck kann nicht zur Steuerung des Ausführungsflusses von .__ verwendet werden. Transact-SQL-Anweisungen, Anweisungsblöcke, benutzerdefinierte Funktionen und Gespeicherte Prozeduren.
Wenn Ihre Anforderungen durch diese Einschränkungen nicht erfüllt werden können (z. B. die Notwendigkeit, abhängig von einer Bedingung unterschiedlich geformte Ergebnismengen zurückzugeben), verfügt SQL Server auch über ein prozedurales Schlüsselwort IF
.
IF @IncludeExtendedInformation = 1
BEGIN
SELECT A,B,C,X,Y,Z
FROM T
END
ELSE
BEGIN
SELECT A,B,C
FROM T
END
Einige schöne Beispiele finden Sie in Die Power of SQL-CASE-Anweisungen, und ich denke, die Aussage, die Sie verwenden können, wird etwa so aussehen (von 4guysfromrolla )
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
Anwendungsfall. Etwas wie das.
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
Von diesem link können wir IF THEN ELSE
in T-SQL
verstehen:
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'
Ist das nicht gut genug für T-SQL?
Microsoft SQL Server (T-SQL)
In einer ausgewählten Verwendung:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
Verwenden Sie in einer where-Klausel Folgendes:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
Einfache if-else-Anweisung in SQL Server:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
Geschachtelte If ... else-Anweisung in SQL Server -
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
In SQL Server 2012 wurde eine neue Funktion IIF (die wir einfach verwenden können) hinzugefügt:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Verwenden Sie reine Bitlogik:
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
Siehe Arbeitsdemo: WENN DANN OHNE FALL IN MSSQL
Für den Start müssen Sie den Wert von true
und false
für ausgewählte Bedingungen ermitteln. Hier kommen zwei NULLIF :
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
zusammen ergibt 1 oder 0. Nächste Verwendung bitweise Operatoren .
Es ist die meiste WYSIWYG Methode.
Verwenden Sie eine CASE-Anweisung:
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
Dies ist keine Antwort, nur ein Beispiel für eine CASE-Anweisung, in der ich arbeite. Es hat eine verschachtelte CASE-Anweisung. Jetzt weißt du, warum meine Augen gekreuzt sind.
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]
Wenn Sie zum ersten Mal Ergebnisse in eine Tabelle einfügen, anstatt Ergebnisse von einer Tabelle in eine andere zu übertragen, funktioniert dies in 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');
Als Alternative zur CASE
-Anweisung kann ein tabellengesteuerter Ansatz verwendet werden.
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
Ergebnis:
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
Für diejenigen, die SQL Server 2012 verwenden, ist IIF eine hinzugefügte Funktion, die als Alternative zu Case-Anweisungen fungiert.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
WÄHLEN SIE CAST (CASE WENN Obsolete = 'N' oder InStock = 'Y' THEN ELSE 0 END AS bit) als verkaufsfähig, * FROM-Produkt
Sie haben zwei Möglichkeiten, dies zu implementieren:
1) Verwenden von IIF, das von SQL 2012 eingeführt wurde:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
2) Verwendung von Select Case:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Frage ... SELECT WENN (veraltet = 'N' OR InStock = 'Y'? 1: 0) AS verkaufsfähig, * FROM Produkt
ANSI: Fall auswählen, wenn p.Obsolete = 'N' oder p.InStock = 'Y', dann 1 sonst 0 als verkaufsfähig, S. * FROM Produkt p;
Die Verwendung von Aliasnamen - p in diesem Fall - hilft, Probleme zu vermeiden.