Frage

Wie führe ich eine IF...THEN in einer SQL SELECT Aussage?

Zum Beispiel:

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

Lösung

Die CASE Aussage in der Nähe von IF in SQL ist und auf 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 tun, wenn Sie das Ergebnis als Booleschen Wert wollen. Wenn Sie mit einem int glücklich sind, das funktioniert:

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

CASE Aussagen können auch in anderen CASE Anweisungen eingebettet werden und auch in Aggregaten enthalten.

SQL Server Denali (SQL Server 2012) fügt die Zugang verfügbar ist ( zeigte von Martin Smith out ):

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

Andere Tipps

Die case-Anweisung ist dein Freund in dieser Situation und nimmt 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 einer durch Klausel für wirklich Lust Bestellung setzen.

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

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

Dies ist effektiv nur eine Abkürzung (wenn auch nicht Standard-SQL) Art und Weise CASE zu schreiben.

Ich ziehe die Prägnanz, wenn sie mit der erweiterten CASE Version verglichen.

Sowohl IIF() und CASE Entschlossenheit als Ausdrücke innerhalb einer SQL-Anweisung und können nur in gut definierten Orten verwendet werden.

  

Der Ausdruck CASE kann den Ablauf der Ausführung zu steuern, verwendet werden,   Transact-SQL-Anweisungen, Anweisungsblocks, benutzerdefinierte Funktionen und   Stored Procedures.

Wenn sich Ihre Bedürfnisse nicht durch diese Einschränkungen erfüllt werden (zum Beispiel ein Bedarf zurück unterschiedlich geformte Ergebnis setzt abhängig von einer Bedingung), dann SQL Server hat auch 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

Es muss manchmal genommen werden Parameter zu vermeiden Probleme mit diesem Ansatz Sniffing jedoch .

Sie können ein paar schöne Beispiele in Die Macht der SQL-Anweisungen CASE , und ich denke, die Aussage, dass Sie so etwas wie diese verwenden können (von 4guysfromrolla ):

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

Use-Case. So etwas wie dies.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT

Microsoft SQL Server (T-SQL)

In einem select, zu verwenden:

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

In einer where Klausel verwenden:

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

Von Link , können wir verstehen, IF THEN ELSE in 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?

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

Verwenden Sie eine CASE-Anweisung:

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

etc...

Ein neues Feature, IIF (das können wir einfach nutzen) wurde in SQL Server 2012 hinzugefügt:

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

Verwenden Sie reine Bit Logik:

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 Arbeits Demo:. Wenn dann ohne case in SQL Server

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

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

kombiniert ergibt zusammen 1 oder 0 Weiter verwenden Bitoperatoren .

Es ist die WYSIWYG Methode.

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' )
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
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

Das ist keine Antwort, nur ein Beispiel für eine CASE-Anweisung im Einsatz, wo ich arbeite. Es hat eine verschachtelte CASE-Anweisung. Jetzt wissen Sie, warum meine Augen gekreuzt werden.

 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]

Wenn Sie die Ergebnisse in eine Tabelle zum ersten Mal sind das Einfügen, anstatt Ergebnisse von einem Tisch zum anderen zu übertragen, das funktioniert in Oracle 11,2 g:

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');

Als alternative Lösung zur CASE Anweisung, ein tabellengesteuerte Ansatz verwendet werden kann:

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

Für diejenigen, die SQL Server verwendet 2012 IIF ist ein Feature, das hinzugefügt wurde, und arbeitet als Alternative zu den Case-Anweisungen.

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

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;

Mit Aliase - p in diesem Fall - wird dazu beitragen, Probleme zu verhindern

.

können Sie haben zwei Möglichkeiten für diese tatsächlich umzusetzen:

  1. IIF verwenden, die von SQL Server 2012 eingeführt wurde:

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

    SELECT CASE
        WHEN Obsolete = 'N' or InStock = 'Y'
            THEN 1
            ELSE 0
        END as Saleable, *
        FROM Product
    
SELECT 
  CAST(
    CASE WHEN Obsolete = 'N' 
    or InStock = 'Y' THEN ELSE 0 END AS bit
  ) as Saleable, * 
FROM 
  Product
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top