1774 Stimmen

Wie führe ich ein IF...THEN in einem SQL SELECT aus?

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

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 y CHECK aber nicht SELECT .

7 Stimmen

Die Antwort von @MartinSmith ist die eleganteste - verwenden Sie IIF in SQL 2012+.

2021voto

Darrel Miller Punkte 133891

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

62 Stimmen

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 :)

25 Stimmen

Und vergessen Sie nicht das ENDE

0 Stimmen

Obwohl dies funktioniert, ist die Verwendung der Funktion IFF() die bessere Lösung

364voto

Jonathan Punkte 24623

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.

34 Stimmen

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

9 Stimmen

Ich habe immer das Gefühl, dass die zweite Variante einfacher ist.

4 Stimmen

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.

313voto

Martin Smith Punkte 417623

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

In manchen Fällen muss jedoch darauf geachtet werden, dass bei diesem Ansatz keine Probleme mit Parameter-Sniffing auftreten .

6 Stimmen

Dies sollte die Antwort sein, wenn Sie eine IF then-Anweisung in SQL wollen.

113voto

sven Punkte 17688

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

4 Stimmen

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.

2 Stimmen

Der Verweis ist wirklich nützlich und sehr empfehlenswert, falls Sie weitere Details benötigen.

87voto

palehorse Punkte 24327

CASE verwenden. Etwa so.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END

CodeJaeger.com

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.

Powered by:

X