it-swarm-eu.dev

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

Wie führe ich einen IF...THEN in einer SQL SELECT-Anweisung aus?

Zum Beispiel:

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

Die CASE-Anweisung ist der IF in SQL am nächsten und wird in allen SQL Server-Versionen 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 Variable CAST ausführen, wenn das Ergebnis als boolescher Wert angezeigt werden soll. Wenn Sie mit einer Variable int zufrieden sind, funktioniert dies: 

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

CASE-Anweisungen können in andere CASE-Anweisungen eingebettet und sogar in Aggregate eingeschlossen werden. 

SQL Server Denali (SQL Server 2012) fügt die Anweisung IIF hinzu, die auch in access : verfügbar ist (unter Hinweis auf Martin Smith ).

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

Die Fallaussage ist Ihr Freund in dieser Situation 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 setzen, um wirklich ausgefallene Bestellungen zu treffen.

301
Jonathan

Ab SQL Server 2012 können Sie dazu die Funktion IIF verwenden.

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

Dies ist effektiv nur eine Kurzform (wenn auch nicht Standard-SQL), um CASE zu schreiben. 

Ich bevorzuge die Prägnanz gegenüber der erweiterten CASE-Version.

Sowohl IIF() als auch CASE werden als Ausdrücke in einer SQL-Anweisung aufgelöst und können nur an genau definierten Stellen verwendet werden. 

Der CASE-Ausdruck kann nicht zur Steuerung des Ausführungsflusses 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 ein prozedurales Schlüsselwort IF .

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

Es muss jedoch manchmal darauf geachtet werden, dass mit diesem Ansatz Probleme beim Parameter-Sniffing vermieden werden.

236
Martin Smith

Einige schöne Beispiele finden Sie in Die Power of SQL-CASE-Anweisungen, und ich denke, die Aussage, die Sie verwenden können, wird etwa so aussehen (von 4guysfromrolla

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

Anwendungsfall. Etwas wie das.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
73
palehorse
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
46
John Sheehan
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT
43
Santiago Cepas

Von diesem link können wir IF THEN ELSE in 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?

41
Ken

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

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

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

Geschachtelte 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
29
Ravi Anand

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

SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
23
sandeep rawat

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 FALL IN MSSQL

Für den Start müssen Sie den Wert von true und false für ausgewählte Bedingungen ermitteln. Hier kommen zwei NULLIF :

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

zusammen ergibt 1 oder 0. Nächste Verwendung bitweise Operatoren .

Es ist die meiste WYSIWYG Methode.

23
Tomasito

Verwenden Sie eine CASE-Anweisung:

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

etc...
22
Christopher
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' )
18
onedaywhen
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
15
atik sarker
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
13
Chanukya

Dies ist keine Antwort, nur ein Beispiel für eine CASE-Anweisung, in der ich arbeite. Es hat eine verschachtelte CASE-Anweisung. Jetzt weißt du, 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]
12
JustJohn

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

Als Alternative 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
9
Serkan Arslan
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product
8
user8422856
  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
6

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

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

WÄHLEN SIE CAST (CASE WENN Obsolete = 'N' oder InStock = 'Y' THEN ELSE 0 END AS bit) als verkaufsfähig, * FROM-Produkt

0
gii96

Sie haben zwei Möglichkeiten, dies zu implementieren:

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

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

2) Verwendung von Select Case:

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

Frage ... SELECT WENN (veraltet = 'N' OR InStock = 'Y'? 1: 0) AS verkaufsfähig, * FROM Produkt

ANSI: Fall auswählen, wenn p.Obsolete = 'N' oder p.InStock = 'Y', dann 1 sonst 0 als verkaufsfähig, S. * FROM Produkt p;

Die Verwendung von Aliasnamen - p in diesem Fall - hilft, Probleme zu vermeiden.

0
David Cohn