Wie führe ich eine IF...THEN
in einem SQL SELECT
Aussage?
Zum Beispiel:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Wie führe ich eine IF...THEN
in einem SQL SELECT
Aussage?
Zum Beispiel:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
El CASE
Anweisung kommt dem IF in SQL am nächsten und wird von 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
Operator, wenn Sie das Ergebnis als booleschen Wert haben wollen. Wenn Sie sich mit einem int
funktioniert das:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
CASE
Anweisungen können in andere Anweisungen eingebettet werden CASE
Angaben und sogar in Aggregaten enthalten.
SQL Server Denali (SQL Server 2012) fügt die IIF Anweisung, die auch in Zugang (hervorgehoben durch Martin Smith ):
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
Nur ein zusätzliches Wort der Warnung: Schließen Sie Ihre Bedingungen nicht in Bremsen ein, wenn Sie einen Koffer verwenden. Hat ziemlich viel Zeit in Anspruch genommen, um das zu erkennen :)
Die Fallaussage ist in dieser Situation Ihr Freund 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 einfügen, um eine wirklich ausgefallene Reihenfolge zu erhalten.
Ich weiß, dies ist alt, aber ich denke, es sollte erwähnt werden, dass Sie eine AS Col_Name
nach dem END
um die resultierende Spalte zu benennen
Ich stimme zu, dass ich fast immer die erweiterte Case-Anweisung verwende, weil die Bedingungen, die ich testen möchte, immer komplexer sind als nur die eine Variable selbst. Außerdem ist sie für mich einfach leichter zu lesen.
Ab SQL Server 2012 können Sie die IIF
Funktion für diese.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Dies ist im Grunde nur eine Kurzform (wenn auch nicht der SQL-Standard) für das Schreiben von CASE
.
Ich bevorzuge die Prägnanz im Vergleich zur erweiterten CASE
Version.
Beide IIF()
y CASE
werden als Ausdrücke innerhalb einer SQL-Anweisung aufgelöst und können nur an genau definierten Stellen verwendet werden.
Der CASE-Ausdruck kann nicht verwendet werden, um den Ablauf der Ausführung von Transact-SQL-Anweisungen, Anweisungsblöcken, benutzerdefinierten Funktionen und gespeicherten Prozeduren.
Wenn Ihre Anforderungen durch diese Beschränkungen nicht erfüllt werden können (z. B. wenn Sie abhängig von einer Bedingung unterschiedlich geformte Ergebnismengen zurückgeben müssen), verfügt SQL Server auch über 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
Einige schöne Beispiele finden Sie unter Die Leistungsfähigkeit von SQL CASE-Anweisungen und ich denke, dass die Anweisung, die Sie verwenden können, etwa so aussehen wird (aus 4JungsausRollla ):
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
Siehe: meta.stackexchange.com/questions/103053/ für eine interessante Diskussion. Die beiden von Ihnen angegebenen Links liefern zusätzlichen Kontext, was ich unterstütze.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
17 Stimmen
Das sollten Sie sich ansehen Link . Bezüglich: SQL WHERE-Klauseln: Vermeiden Sie CASE, verwenden Sie boolesche Logik
4 Stimmen
@Somebody: Das ist nicht wirklich relevant, denn in dem Artikel geht es darum, logische Umschreibregeln zu verwenden, um eine Implikation in eine Disjunktion umzuwandeln. Der Hinweis ist das Wort "logisch", d. h. etwas, das sich in wahr oder falsch auflöst, was für die Projektion nicht zutrifft. TL;DR Artikel gilt für
WHERE
yCHECK
aber nichtSELECT
.7 Stimmen
Die Antwort von @MartinSmith ist die eleganteste - verwenden Sie IIF in SQL 2012+.