Wie führe ich ein IF… THEN in einem SQL SELECT durch?

1508

Wie führe ich eine IF...THENin einer SQL SELECTAnweisung durch?

Zum Beispiel:

SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Eric Labashosky
quelle
14
Vielleicht möchten Sie einen Blick auf diesen Link werfen . In Bezug auf: SQL WHERE-Klauseln: Vermeiden Sie CASE, verwenden Sie Boolesche Logik
Jemand
3
@Somebody: Nicht wirklich relevant, da der Artikel über die Verwendung logischer Umschreibregeln zum Konvertieren einer Implikation in eine Disjunktion spricht. Der Hinweis ist das Wort "logisch", dh etwas, das sich in wahr oder falsch auflöst und nicht für die Projektion gilt. TL; DR Artikel gilt für WHEREund CHECKaber nicht SELECT.
Tag, wenn
6
@ MartinSmiths Antwort ist die eleganteste - verwenden Sie IIF in SQL 2012+.
Murray Foxcroft

Antworten:

1760

Die CASEAnweisung kommt 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 dies nur tun, CASTwenn Sie das Ergebnis als Booleschen Wert wünschen. Wenn Sie mit einem zufrieden sind int, funktioniert dies:

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

CASEAnweisungen können in andere CASEAnweisungen eingebettet und sogar in Aggregaten enthalten sein.

SQL Server Denali (SQL Server 2012) fügt die IIF- Anweisung hinzu, die auch im Zugriff verfügbar ist (von Martin Smith hervorgehoben ):

SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
Darrel Miller
quelle
57
Nur ein zusätzliches Wort der Vorsicht, schließen Sie Ihre Bedingungen nicht in Klammern ein, wenn Sie den Koffer verwenden. Es hat ziemlich lange
gedauert
17
und vergessen Sie nicht das ENDE
Simon_Weaver
8
und das AS-Bit!
Cas Bloem
8
Fall, wenn, sonst und Ende parallel eingerückt werden sollten (entlang derselben Linie) - und nur dann weiter nach innen eingerückt werden sollten - funktioniert am besten für mich.
Ujjwal Singh
6
@ ReeveStrife Nur wenn SQL Server 2012+
stuartdotnet
327

Die case-Anweisung 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 Bestellung zu erhalten.

Jonathan
quelle
32
Ich weiß, dass dies alt ist, aber ich denke, es sollte beachtet werden, dass Sie ein AS Col_Namenach dem hinzufügen können, um ENDdie resultierende Spalte zu benennen
Ben
9
Ich habe immer das Gefühl, dass der zweite einfacher ist.
Hogan
4
Einverstanden bin, dass ich fast immer die erweiterte case-Anweisung verwende, da die Bedingungen, unter denen ich testen möchte, immer komplexer sind als nur die eine Variable selbst. Es fühlt sich für mich auch einfacher an zu lesen.
magnum_pi
1
Gute Erklärung für beide Situationen mit oder ohne Variable. Mit der Variablen muss die Bedingung eine Gleichheit zwischen der Variablen nach der case-Anweisung und derjenigen erfüllen, auf die Sie Ihre Bedingung stützen. Ohne Variable können Sie eine autarke Bedingung zum Testen hinzufügen.
Remus.A
Ich bin mit der zweiten Option bequemer. Die beiden sind gleich gut.
Stanley Okpala Nwosa
277

Ab SQL Server 2012 können Sie die IIFFunktion hierfür verwenden.

SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM   Product

Dies ist praktisch nur eine Kurzschrift (wenn auch keine Standard-SQL-Schreibweise) CASE.

Ich bevorzuge die Prägnanz im Vergleich zur erweiterten CASEVersion.

Beide IIF()und CASElösen sich als Ausdrücke innerhalb einer SQL-Anweisung auf und können nur an genau definierten Stellen verwendet werden.

Der CASE-Ausdruck kann nicht zur Steuerung des Ausführungsflusses von Transact-SQL-Anweisungen, Anweisungsblöcken, benutzerdefinierten Funktionen und gespeicherten Prozeduren verwendet werden.

Wenn Ihre Anforderungen durch diese Einschränkungen nicht erfüllt werden können (z. B. die Notwendigkeit, abhängig von einer bestimmten Bedingung unterschiedlich geformte Ergebnismengen zurückzugeben), verfügt SQL Server auch über ein prozedurales IFSchlüsselwort.

IF @IncludeExtendedInformation = 1
  BEGIN
      SELECT A,B,C,X,Y,Z
      FROM   T
  END
ELSE
  BEGIN
      SELECT A,B,C
      FROM   T
  END

Manchmal muss jedoch darauf geachtet werden, dass bei diesem Ansatz keine Probleme mit dem Parameter-Sniffing auftreten .

Martin Smith
quelle
6
Dies sollte die Antwort sein, wenn Sie eine IF .. then-Anweisung in SQL wünschen.
Mr.J
91

Sie finden einige schöne Beispiele in The Power of SQL CASE-Anweisungen , und ich denke, die Anweisung, die Sie verwenden können, wird ungefähr so aussehen (von 4guysfromrolla ):

SELECT
    FirstName, LastName,
    Salary, DOB,
    CASE Gender
        WHEN 'M' THEN 'Male'
        WHEN 'F' THEN 'Female'
    END
FROM Employees
sven
quelle
4
Eine interessante Diskussion finden Sie unter: meta.stackexchange.com/questions/103053/… . Die beiden von Ihnen bereitgestellten Links fügen zusätzlichen Kontext hinzu, den ich unterstütze.
Sam Saffron
2
Die Referenz ist wirklich nützlich und sehr empfehlenswert für den Fall zusätzlicher Details
Baymax
75

Anwendungsfall. Etwas wie das.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
Palehorse
quelle
50
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
John Sheehan
quelle
48

Microsoft SQL Server (T-SQL)

In einem select, verwenden:

select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end

whereVerwenden Sie in einer Klausel:

where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
user7658
quelle
1
warum würdest du nicht einfach where Obsolete = 'N' or InStock = 'Y'das wo praktisch
halbieren
46

Aus diesem Link können wir IF THEN ELSEin 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?

Ken
quelle
3
Dies ist nicht das, was der Anforderer wollte, aber es ist sehr nützlich zu wissen, dass Sie if-Anweisungen außerhalb einer select-Anweisung verwenden können.
Jonathan
2
EXISTS ist gut, weil es aus der Suchschleife austritt, wenn ein Element gefunden wird. Ein COUNT wird bis zum Ende der Tabellenzeilen ausgeführt. Nichts mit Fragen zu tun, aber etwas zu wissen.
JustJohn
45
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT
Santiago Cepas
quelle
32

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
Ravi Anand
quelle
2
Spät, aber ist es innen verwendbar, SELECTwie OP gefragt hat?
Abdul Qayyum
25

Eine neue Funktion, IIF (die wir einfach verwenden können), wurde in SQL Server 2012 hinzugefügt:

SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Sandeep Rawat
quelle
1
Diese Antwort wiederholt (mit weniger Details), was bereits vor einigen Jahren in der Antwort von Martin Smith angegeben wurde.
jk7
1
@ jk7 Dies war die erste Antwort auf die Frage.
Sandeep Rawat
3
Nicht von dem, was ich sehe. Es heißt, Ihre Antwort wurde am 26. April 16 und Martin's am 20. Juli 11 veröffentlicht.
jk7
24

Verwenden Sie eine CASE-Anweisung:

SELECT CASE
       WHEN (Obsolete = 'N' OR InStock = 'Y')
       THEN 'Y'
       ELSE 'N'
END as Available

etc...
Krizzy
quelle
23

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 casein SQL Server .

Zu Beginn müssen Sie den Wert trueund falsefür ausgewählte Bedingungen berechnen . Hier kommen zwei NULLIF :

for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)

kombiniert ergibt 1 oder 0. Verwenden Sie als nächstes bitweise Operatoren .

Es ist die WYSIWYG- Methode.

Tomasito
quelle
19
-1 für Code-Verschleierung. Im Ernst, das ist ungefähr so ​​weit von WYSIWYG entfernt, wie Sie nur können! Ein rötliches, unlesbares Durcheinander, und wenn ich an Ihrem Code arbeiten müsste, würde ich den ganzen Tag fluchen ... Entschuldigung: - /
Heliac
2
@Heliac setzen cte Teil in Ansicht und Sie werden nie das Chaos sehen. Für lange und komplizierte UND, ODER, NICHT, es ist besser lesbar als CASE (dieser Teil außerhalb von cte natürlich).
Tomasito
1
Ich habe dies eine +1 für die Ordentlichkeit gegeben, sobald es in einem cte ist, aber beachte, dass die Antwort derzeit für die Frage falsch ist. Du brauchst ein '|' kein '&'.
Mark Hurd
3
Stimme voll und ganz @Heliac zu. Obwohl es syntaktisch korrekt ist und gut funktioniert, ist es einfach nicht einfach zu unterstützen. Wenn Sie es in einen CTE einfügen, wird dieser nicht lesbare Code nur an eine andere Stelle verschoben.
objectNotFound
1
Die Tabellenmethode zur Überprüfung der Kombination könnte ihre Vorteile haben. Die Verwendung einer Tabellenvariablen und das Verknüpfen mit der vorhandenen Abfrage könnte eine satzbasierte Lösung ohne Fall liefern. Diese Antwort ist ein schlechtes Beispiel, aber die Tabellenidee selbst hat ihre Berechtigung.
Suncat2000
19
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' )
eines Tages, wenn
quelle
17
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
Atik Sarker
quelle
Können Sie das näher erläutern?
Peter Mortensen
14
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
Chanukya
quelle
2
Könnten Sie bitte erklären, wie dies die gestellte Frage beantwortet?
Guanxi
@Guanxi: Obwohl nicht meine Antwort, verallgemeinert ein "Fall" ein "Wenn-Dann-Sonst" (von 2 Fällen zu vielen)
JosephDoggie
Können Sie das näher erläutern?
Peter Mortensen
13

Dies ist keine Antwort, sondern nur ein Beispiel für eine CASE-Anweisung, die bei meiner Arbeit verwendet wird. Es hat eine verschachtelte CASE-Anweisung. Jetzt wissen Sie, 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]
JustJohn
quelle
1
Die Bearbeitung, mit der die Case-Anweisungen neu formatiert wurden, ist in Ordnung und verständlich und verständlicher, aber die SQL-Datei würde in der Ansicht, in der sie verwendet wird, immer noch zusammenfallen.
JustJohn
1
Ich CASEwandere nur umher, warum ich als Antwort hochgestuft und markiert werde, anstatt als die, IFdie die Antwort hätte sein sollen, wie diese, dies ist immer noch eine CASEAussage, keine IF.
Mr.J
@ Mr.J: Obwohl nicht meine Antwort, verallgemeinert ein "Fall" ein "Wenn-Dann-Sonst" (von 2 Fällen zu vielen)
JosephDoggie
12

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');
Robert B. Grossman
quelle
4
Die Tags sagen SQL Server, TSQL
Malachi
11

Als alternative Lösung zur CASEAussage 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
Serkan Arslan
quelle
Verkaufbar wird in welcher Bedingung in Abfrage verwendet?
Bhavin Thummar
Es kann in wo Zustand verwendet werden.
Serkan Arslan
9
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product

quelle
6

Für diejenigen, die SQL Server 2012 verwenden, ist IIF eine Funktion, die hinzugefügt wurde und als Alternative zu Case-Anweisungen fungiert.

SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM   Product 
Dibin
quelle
1
Diese Antwort wiederholt (mit weniger Details), was bereits vor einigen Jahren in der Antwort von Martin Smith angegeben wurde.
jk7
6
  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
SURJEET SINGH Bisht
quelle
7
Hallo Surjeet Singh Bisht; Ihr Code mag korrekt sein, aber mit einem gewissen Kontext würde er eine bessere Antwort geben. Sie könnten beispielsweise erklären, wie und warum diese vorgeschlagene Änderung das Problem des Fragestellers lösen würde, möglicherweise einschließlich eines Links zu der entsprechenden Dokumentation. Dies würde es für sie nützlicher machen und auch für andere Site-Leser, die nach Lösungen für ähnliche Probleme suchen.
Vince Bowdren
5
Diese Antwort fügt nichts Neues hinzu. Tatsächlich ist genau diese Zeile seit über 5 Jahren Teil der akzeptierten Antwort .
SL Barth - Wiedereinsetzung Monica
1
Darüber hinaus ist es wichtig zu erwähnen, dass die IIF nur für SQL Server ab 2012 gilt
Ivan Rascon
5

Sie haben zwei Möglichkeiten, um dies tatsächlich zu implementieren:

  1. Verwenden von IIF, das von SQL Server 2012 eingeführt wurde:

    SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
  2. Verwenden von Select Case:

    SELECT CASE
        WHEN Obsolete = 'N' or InStock = 'Y'
            THEN 1
            ELSE 0
        END as Saleable, *
        FROM Product
Peter Mortensen
quelle
4

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;

Die Verwendung von Aliasen - pin diesem Fall - hilft, Probleme zu vermeiden.

David Cohn
quelle
3

Die Verwendung von SQL CASE entspricht den normalen If / Else-Anweisungen. In der folgenden Abfrage: Wenn der veraltete Wert = 'N' oder der InStock-Wert = 'Y' ist, ist die Ausgabe 1. Andernfalls ist die Ausgabe 0. Dann setzen wir diesen 0- oder 1-Wert unter die verkaufsfähige Spalte.

SELECT
      CASE 
        WHEN obsolete = 'N' OR InStock = 'Y' 
        THEN 1 
        ELSE 0 
      END AS Salable
      , * 
FROM PRODUCT
Tharuka
quelle
1
Hört sich gut an. Vielleicht ein oder zwei Worte, um es zu erklären?
JQSOFT
Es ist genau wie bei normalen If / Else-Anweisungen. Wenn der veraltete Wert = 'N' oder der InStock-Wert = 'Y' ist, ist die Ausgabe 1. Andernfalls ist die Ausgabe 0.
Tharuka
1
Vielen Dank. Bitte bearbeiten Sie Ihren Beitrag, um diese Erklärung hinzuzufügen. Gefällt If..Then...Else..SQL
mir
2
SELECT 
  CAST(
    CASE WHEN Obsolete = 'N' 
    or InStock = 'Y' THEN ELSE 0 END AS bit
  ) as Saleable, * 
FROM 
  Product
gii96
quelle
8
Aus dem Test: Willkommen bei Stack Overflow! Bitte antworten Sie nicht nur mit dem Quellcode. Versuchen Sie, eine schöne Beschreibung der Funktionsweise Ihrer Lösung zu geben. Siehe: Wie schreibe ich eine gute Antwort? . Danke
sɐunıɔ ןɐ qɐp
3
Ich denke, Sie werden feststellen, dass dies nicht ausgeführt wird, da keine Ausgabe nach dem Schlüsselwort 'THEN' fehlt.
Dodecaphone
Können Sie das näher erläutern?
Peter Mortensen
2

Es wird so etwas sein:

SELECT OrderID, Quantity,
CASE
    WHEN Quantity > 30 THEN "The quantity is greater than 30"
    WHEN Quantity = 30 THEN "The quantity is 30"
    ELSE "The quantity is under 30"
END AS QuantityText
FROM OrderDetails;
Muhammad Awais
quelle
Können wir den QuantityText-Wert in der where-Bedingung in einer Abfrage verwenden? zum BeispielSELECT OrderID, Quantity, CASE WHEN Quantity > 30 THEN "The quantity is greater than 30" WHEN Quantity = 30 THEN "The quantity is 30" ELSE "The quantity is under 30" END AS QuantityText FROM OrderDetails WHERE QuantityText = 'The quantity is 30';
Bhavin Thummar
1

Der Vollständigkeit halber möchte ich hinzufügen, dass SQL dreiwertige Logik verwendet. Der Ausdruck:

obsolete = 'N' OR instock = 'Y'

Könnte drei unterschiedliche Ergebnisse liefern:

| obsolete | instock | saleable |
|----------|---------|----------|
| Y        | Y       | true     |
| Y        | N       | false    |
| Y        | null    | null     |
| N        | Y       | true     |
| N        | N       | true     |
| N        | null    | true     |
| null     | Y       | true     |
| null     | N       | null     |
| null     | null    | null     |

Wenn zum Beispiel ein Produkt veraltet ist, Sie aber nicht wissen, ob das Produkt instock ist, wissen Sie nicht, ob das Produkt verkaufsfähig ist. Sie können diese dreiwertige Logik wie folgt schreiben:

SELECT CASE
           WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
           WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
           ELSE NULL
       END AS saleable

Sobald Sie herausgefunden haben, wie es funktioniert, können Sie drei Ergebnisse in zwei Ergebnisse konvertieren, indem Sie das Verhalten von null festlegen. Zum Beispiel würde dies null als nicht verkaufsfähig behandeln:

SELECT CASE
           WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
           ELSE 'false' -- either false or null
       END AS saleable
Salman A.
quelle
0

Ich mag die Verwendung der CASE-Anweisungen, aber die Frage nach einer IF-Anweisung in SQL Select. Was ich in der Vergangenheit verwendet habe, war:

SELECT

   if(GENDER = "M","Male","Female") as Gender

FROM ...

Es ist wie bei den IF-Anweisungen von Excel oder Sheets, bei denen eine Bedingung gefolgt von der wahren Bedingung und dann der falschen Bedingung vorliegt:

if(condition, true, false)

Außerdem können Sie die if-Anweisungen verschachteln (aber dann sollte use ein CASE verwenden :-)

(Hinweis: Dies funktioniert in MySQLWorkbench, aber möglicherweise nicht auf anderen Plattformen.)

Prashant Marathay
quelle
0

Sie können Case Statement verwenden:

Select 
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product
Akanksha Gupta
quelle