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


Wie führe ich ein? IF...THEN in einem (n SQL SELECT Erklärung?

Beispielsweise:

SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product

1221
2017-09-15 14:34


Ursprung


Antworten:


Das CASE Anweisung ist 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 das tun CAST Wenn Sie das Ergebnis als booleschen Wert wünschen, wenn Sie mit einem zufrieden sind int, das funktioniert:

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

CASE Anweisungen können in andere eingebettet sein CASE Aussagen und sogar in Aggregaten enthalten.

SQL Server Denali (SQL Server 2012) fügt das hinzu IIF Anweisung, die auch in verfügbar ist Zugriff: (darauf hingewiesen von Martin Smith)

SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product

1457
2017-09-15 14:38



Die Case-Anweisung ist in dieser Situation Ihr Freund und hat 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 order by-Klausel für wirklich ausgefallene Bestellungen platzieren.


282
2017-09-15 15:10



Von SQL Server 2012 können Sie die verwenden IIF Funktion dafür.

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

Dies ist effektiv nur eine Kurzschreibweise (wenn auch nicht Standard-SQL) CASE.

Ich bevorzuge die Prägnanz im Vergleich zu den erweiterten CASE Ausführung.

Beide IIF() und CASE Als Ausdrücke in einer SQL-Anweisung auflösen und nur an genau definierten Stellen verwenden.

Der CASE-Ausdruck kann nicht zum Steuern des Ausführungsablaufs von verwendet werden   Transact-SQL-Anweisungen, Anweisungsblöcke, benutzerdefinierte Funktionen und   Gespeicherte Prozeduren.

Wenn Ihre Anforderungen durch diese Einschränkungen nicht erfüllt werden können (z. B. die Notwendigkeit, abhängig von einer Bedingung unterschiedlich geformte Ergebnismengen zurückzugeben), verfügt SQL Server auch über eine Prozedur 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 

Bei diesem Ansatz müssen jedoch manchmal Probleme mit Parameter-Sniffing vermieden werden.


213
2017-07-20 23:39



Sie können einige nette Beispiele in finden Die Power of SQL CASE-Anweisungen, und ich denke, dass die Aussage, die Sie verwenden können, so sein wird (von 4guysfromrolla):

SELECT
    FirstName, LastName,
    Salary, DOB,
    CASE Gender
        WHEN 'M' THEN 'Male'
        WHEN 'F' THEN 'Female'
    END
FROM Employees

74
2017-09-15 14:39



Anwendungsfall. Etwas wie das.

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

68
2017-09-15 14:37



SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product

42
2017-09-15 14:37



 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT

37
2017-09-15 14:37



Microsoft SQL Server (T-SQL)

In einer ausgewählten Verwendung:

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

Verwenden Sie in einer Where-Klausel:

where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end

35
2017-09-15 14:40



Davon VerknüpfungWir können es verstehen IF THEN ELSE im 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?


34
2018-01-06 01:02