Wie führe ich ein IF ... THEN in einer SQL-SELECT?
-
09-06-2019 - |
Frage
Wie führe ich eine IF...THEN
in einer SQL SELECT
Aussage?
Zum Beispiel:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Lösung
Die CASE
Aussage in der Nähe von IF in SQL ist und auf allen Versionen von SQL Server 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 CAST
tun, wenn Sie das Ergebnis als Booleschen Wert wollen. Wenn Sie mit einem int
glücklich sind, das funktioniert:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
CASE
Aussagen können auch in anderen CASE
Anweisungen eingebettet werden und auch in Aggregaten enthalten.
SQL Server Denali (SQL Server 2012) fügt die Zugang verfügbar ist ( zeigte von Martin Smith out ):
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
Andere Tipps
Die case-Anweisung ist dein Freund in dieser Situation und nimmt 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 einer durch Klausel für wirklich Lust Bestellung setzen.
Von SQL Server 2012 können Sie die verwenden IIF
Funktion für diese.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Dies ist effektiv nur eine Abkürzung (wenn auch nicht Standard-SQL) Art und Weise CASE
zu schreiben.
Ich ziehe die Prägnanz, wenn sie mit der erweiterten CASE
Version verglichen.
Sowohl IIF()
und CASE
Entschlossenheit als Ausdrücke innerhalb einer SQL-Anweisung und können nur in gut definierten Orten verwendet werden.
Der Ausdruck CASE kann den Ablauf der Ausführung zu steuern, verwendet werden, Transact-SQL-Anweisungen, Anweisungsblocks, benutzerdefinierte Funktionen und Stored Procedures.
Wenn sich Ihre Bedürfnisse nicht durch diese Einschränkungen erfüllt werden (zum Beispiel ein Bedarf zurück unterschiedlich geformte Ergebnis setzt abhängig von einer Bedingung), dann SQL Server hat auch eine prozedurale IF
Stichwort.
IF @IncludeExtendedInformation = 1
BEGIN
SELECT A,B,C,X,Y,Z
FROM T
END
ELSE
BEGIN
SELECT A,B,C
FROM T
END
Es muss manchmal genommen werden Parameter zu vermeiden Probleme mit diesem Ansatz Sniffing jedoch .
Sie können ein paar schöne Beispiele in Die Macht der SQL-Anweisungen CASE , und ich denke, die Aussage, dass Sie so etwas wie diese verwenden können (von 4guysfromrolla ):
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
Use-Case. So etwas wie dies.
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 Server (T-SQL)
In einem select
, zu verwenden:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
In einer where
Klausel verwenden:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
Von Link , können wir verstehen, IF THEN ELSE
in 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'
Ist das nicht gut genug für T-SQL?
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
Verschachtelte 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
Verwenden Sie eine CASE-Anweisung:
SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
Ein neues Feature, IIF (das können wir einfach nutzen) wurde in SQL Server 2012 hinzugefügt:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Verwenden Sie reine Bit Logik:
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 Arbeits Demo:. Wenn dann ohne case
in SQL Server
Für den Start, müssen Sie den Wert von true
und false
für ausgewählte Bedingungen erarbeiten. Hier kommt zwei NULLIF :
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
kombiniert ergibt zusammen 1 oder 0 Weiter verwenden Bitoperatoren .
Es ist die WYSIWYG Methode.
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
Das ist keine Antwort, nur ein Beispiel für eine CASE-Anweisung im Einsatz, wo ich arbeite. Es hat eine verschachtelte CASE-Anweisung. Jetzt wissen Sie, warum meine Augen gekreuzt werden.
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 die Ergebnisse in eine Tabelle zum ersten Mal sind das Einfügen, anstatt Ergebnisse von einem Tisch zum anderen zu übertragen, das funktioniert in Oracle 11,2 g:
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 Lösung zur CASE
Anweisung, ein tabellengesteuerte Ansatz verwendet werden kann:
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 verwendet 2012 IIF ist ein Feature, das hinzugefügt wurde, und arbeitet als Alternative zu den Case-Anweisungen.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Frage:
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;
Mit Aliase - p
in diesem Fall - wird dazu beitragen, Probleme zu verhindern
können Sie haben zwei Möglichkeiten für diese tatsächlich umzusetzen:
-
IIF verwenden, die von SQL Server 2012 eingeführt wurde:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
-
Mit
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