Hoe voer ik een IF…THEN uit in een SQL SELECT?

Hoe voer ik een IF...THENuit in een SQL SELECT-instructie?

Bijvoorbeeld:

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

Antwoord 1, autoriteit 100%

De CASE-instructie komt het dichtst bij IF in SQL en wordt ondersteund door alle versies van SQL Server.

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

U hoeft de CASTalleen uit te voeren als u het resultaat als een Booleaanse waarde wilt. Als je tevreden bent met een int, werkt dit:

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

CASE-instructies kunnen worden ingesloten in andere CASE-instructies en zelfs worden opgenomen in aggregaten.

SQL Server Denali (SQL Server 2012) voegt de IIF-verklaring die ook beschikbaar is in access( opgemerkt door Martin Smith):

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

Antwoord 2, autoriteit 18%

De case-statement is je vriend in deze situatie en kan twee vormen aannemen:

Het eenvoudige geval:

SELECT CASE <variable> WHEN <value>      THEN <returnvalue>
                       WHEN <othervalue> THEN <returnthis>
                                         ELSE <returndefaultcase>
       END AS <newcolumnname>
FROM <table>

De uitgebreide case:

SELECT CASE WHEN <test>      THEN <returnvalue>
            WHEN <othertest> THEN <returnthis>
                             ELSE <returndefaultcase>
       END AS <newcolumnname>
FROM <table>

Je kunt zelfs case-statements in een volgorde per clausule plaatsen voor echt luxe bestellen.


Antwoord 3, autoriteit 16%

Vanaf SQL Server 2012 kunt u de IIF-functiehiervoor.

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

Dit is eigenlijk gewoon een verkorte (zij het niet standaard SQL) manier om CASEte schrijven.

Ik geef de voorkeur aan beknoptheid in vergelijking met de uitgebreide CASE-versie.

Zowel IIF()als CASEworden opgelost als expressies binnen een SQL-instructie en kunnen alleen op goed gedefinieerde plaatsen worden gebruikt.

De CASE-expressie kan niet worden gebruikt om de uitvoeringsstroom van
Transact-SQL-instructies, instructieblokken, door de gebruiker gedefinieerde functies en
opgeslagen procedures.

Als uw behoeften niet kunnen worden voldaan door deze beperkingen (bijvoorbeeld een behoefte om een ​​verschillend gevormde resultaat-sets afhankelijk van een bepaalde voorwaarde te retourneren) heeft SQL Server ook een procedurele IFtrefwoord.

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

Zorg moet soms worden genomen om parameter snuivende problemen met deze aanpak te voorkomen. .


Antwoord 4, Autoriteit 5%

U kunt enkele leuke voorbeelden vinden in De kracht van SQL Case-verklaringen , en ik denk dat de verklaring dat je kunt gebruiken, zal zoiets zijn (van 4GUYSFROMROLLA ):

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

Antwoord 5, Autoriteit 4%

Gebruik Case. Zoiets.

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

Antwoord 6, Autoriteit 3%

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

Antwoord 7, Autoriteit 3%

Microsoft SQL Server (T-SQL)

Gebruik in een select:

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

Gebruik in een where-clausule:

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

Antwoord 8, autoriteit 3%

Van deze link, we kunnen IF THEN ELSEbegrijpen 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' 

Is dit niet goed genoeg voor T-SQL?


Antwoord 9, autoriteit 2%

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

Antwoord 10, autoriteit 2%

Eenvoudige if-else-instructie in SQL-server:

DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO

Genest If…else-statement 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

Antwoord 11

Gebruik een case-verklaring:

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

Antwoord 12

een nieuwe functie, iif (dat we eenvoudig kunnen gebruiken) , werd toegevoegd in SQL Server 2012:

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

Antwoord 13

Gebruik pure bit logic:

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

Zie WERK DEMO: Als dan zonder casein sql & nbsp ; Server .

Om te beginnen moet je de waarde van trueen falseberekenen voor geselecteerde voorwaarden. Hier komen twee NULLIF:

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

samen gecombineerd geeft 1 of 0. Gebruik vervolgens bitsgewijze operators.

Het is de meest WYSIWYG-methode.


Antwoord 14

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

Antwoord 15

SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile

Antwoord 16

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

Antwoord 17

Dit is geen antwoord, maar een voorbeeld van een CASE-instructie die wordt gebruikt waar ik werk. Het heeft een geneste CASE-instructie. Nu weet je waarom mijn ogen gekruist zijn.

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]

Antwoord 18

Als u de resultaten voor de eerste keer in een tabel invoegt, in plaats van het overbrengen van de resultaten van de ene tabel naar het andere, werkt dit 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');

Antwoord 19

Als een alternatieve oplossing voor de caseverklaring, kan een tabelgedreven aanpak worden gebruikt:

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

Resultaat:

ID          Obsolete   InStock    Saleable
----------- ---------- ---------- -----------
1           N          Y          1
2           A          B          0
3           N          B          1
4           A          Y          1

Antwoord 20

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

Antwoord 21

Voor degenen die SQL Server 2012 gebruiken, is IIF een functie die is toegevoegd en werkt als een alternatief voor Case-statements.

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

Antwoord 22

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

Antwoord 23

U kunt twee keuzes hebben om dit daadwerkelijk te implementeren:

  1. IIF gebruiken, dat werd geïntroduceerd vanaf SQL Server 2012:

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

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

Antwoord 24

Vraag:

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;

Het gebruik van aliassen — pin dit geval — helpt problemen te voorkomen.


Antwoord 25

Het gebruik van SQL CASE is net als normale If / Else-instructies.
In onderstaande query, als verouderde waarde = ‘N’ of als InStock-waarde = ‘Y’, dan is de uitvoer 1. Anders is de uitvoer 0.
Dan plaatsen we die 0 of 1 waarde onder de Verkoopbare Kolom.

SELECT
      CASE 
        WHEN obsolete = 'N' OR InStock = 'Y' 
        THEN 1 
        ELSE 0 
      END AS Salable
      , * 
FROM PRODUCT

Antwoord 26

SELECT
if((obsolete = 'N' OR instock = 'Y'), 1, 0) AS saleable, *
FROM
product;

Antwoord 27

Het zal ongeveer zo zijn:

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;

Antwoord 28

SELECT 
  CAST(
    CASE WHEN Obsolete = 'N' 
    or InStock = 'Y' THEN ELSE 0 END AS bit
  ) as Saleable, * 
FROM 
  Product

Antwoord 29

Voor de volledigheid zou ik willen toevoegen dat SQL driewaardige logica gebruikt. De uitdrukking:

obsolete = 'N' OR instock = 'Y'

Kan drie verschillende resultaten opleveren:

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

Dus als een product bijvoorbeeld verouderd is, maar u weet niet of het product op voorraad is, weet u niet of het product verkoopbaar is. U kunt deze driewaardige logica als volgt schrijven:

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

Zodra u weet hoe het werkt, kunt u drie resultaten converteren naar twee resultaten door het gedrag van null te bepalen. bijv. dit zou null als niet verkoopbaar beschouwen:

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

Antwoord 30

Ik vind het gebruik van de CASE-statements leuk, maar de vraag vroeg om een IF-statement in de SQL Select. Wat ik in het verleden heb gebruikt is:

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

Het is net als in de Excel- of bladen-IF-statements waar er een voorwaarde is, gevolgd door de ware voorwaarde en dan de valse voorwaarde:

if(condition, true, false)

Bovendien kun je de if-statements nesten (maar gebruik dan een CASE 🙂

(Opmerking: dit werkt in MySQLWorkbench, maar werkt mogelijk niet op andere platforms)

Other episodes