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+.

13voto

JustJohn Punkte 1207

Dies ist keine Antwort, sondern nur ein Beispiel für eine CASE-Anweisung, die bei meiner Arbeit verwendet wird. Sie enthält eine verschachtelte CASE-Anweisung. Jetzt wissen Sie, warum ich die Augen schiele.

 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]

1 Stimmen

Die Bearbeitung, die die Case-Anweisungen neu formatiert ist alles schön und gut und macht es verständlicher, aber die SQL würde immer noch alle Klumpen in der Ansicht, die es verwendet wird.

1 Stimmen

Ich frage mich nur, warum CASE hochgestuft und als Antwort markiert werden, anstatt die IF die die Antwort hätte sein sollen, wie diese hier, ist dies immer noch eine CASE Anweisung, nicht eine IF .

0 Stimmen

@Mr.J: auch wenn es nicht meine Antwort ist, verallgemeinert ein "Fall" ein "Wenn-dann-es" (von 2 Fällen auf viele)

13voto

Chanukya Punkte 5645
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

3 Stimmen

Könnten Sie bitte erläutern, wie dies die gestellte Frage beantwortet?

0 Stimmen

@Guanxi: auch wenn es nicht meine Antwort ist, verallgemeinert ein "Fall" ein "Wenn-dann-else" (von 2 Fällen auf viele)

10voto

Wenn Sie Ergebnisse zum ersten Mal 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');

6 Stimmen

Die Tags sagen SQL Server, TSQL

10voto

Serkan Arslan Punkte 12720

Als alternative Lösung 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

0 Stimmen

Saleable wird in der Where-Bedingung der Abfrage verwendet?

0 Stimmen

Es kann in jedem Zustand verwendet werden.

9voto

SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product

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