web-dev-qa-db-fra.com

Comment puis-je effectuer un IF ... THEN dans un SQL SELECT?

Comment puis-je effectuer un IF...THEN dans une instruction SQL SELECT?

Par exemple:

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

L'instruction CASE est la plus proche de IF en SQL et est prise en charge sur toutes les versions de SQL Server.

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

Vous devez seulement faire CAST si vous voulez que le résultat soit une valeur booléenne, si vous êtes satisfait d'une int, ceci fonctionne: 

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

Les instructions CASE peuvent être incorporées dans d'autres instructions CASE et même incluses dans des agrégats. 

SQL Server Denali (SQL Server 2012) ajoute l'instruction IIF qui est également disponible dans access : (signalé par Martin Smith )

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

La déclaration de cas est votre ami dans cette situation et prend l’une des deux formes suivantes:

Le cas simple:

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

Le cas prolongé:

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

Vous pouvez même mettre des instructions de cas dans une commande d'ordre par clause pour une commande vraiment élégante.

301
Jonathan

À partir de SQL Server 2012, vous pouvez utiliser la fonction IIF pour cela.

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

En réalité, il s’agit simplement d’une manière abrégée de écrire CASE

Je préfère la concision par rapport à la version CASE étendue.

IIF() et CASE résolvent tous les deux des expressions dans une instruction SQL et ne peuvent être utilisés que dans des emplacements bien définis. 

L'expression CASE ne peut pas être utilisée pour contrôler le flux d'exécution de Instructions Transact-SQL, blocs d'instructions, fonctions définies par l'utilisateur et procédures stockées.

Si ces limitations ne permettent pas de satisfaire vos besoins (par exemple, la nécessité de renvoyer des ensembles de résultats de formes différentes en fonction de certaines conditions), SQL Server dispose également d'un mot clé IF Keyword.

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

Il faut parfois prendre des précautions pour éviter les problèmes de détection de paramètre avec cette approche.

236
Martin Smith

Vous pouvez trouver quelques exemples intéressants dans La puissance des instructions SQL CASE, et je pense que l'instruction que vous pouvez utiliser ressemblera à quelque chose comme ça (from 4guysfromrolla ): 

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

Cas d'utilisation. Quelque chose comme ça.

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

De ce link , on peut comprendre IF THEN ELSE dans 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' 

N'est-ce pas suffisant pour T-SQL?

41
Ken

Microsoft SQL Server (T-SQL)

Dans une utilisation choisie:

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

Dans une clause where, utilisez:

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

Simple instruction if-else dans SQL Server:

DECLARE @val INT;
SET @val = 15;

IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';

GO

Déclaration imbriquée If ... else dans le serveur SQL -

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

Une nouvelle fonctionnalité, IIF (que nous pouvons simplement utiliser), a été ajoutée à SQL Server 2012:

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

Utilisez une logique de bits pure:

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

Voir Démo de travail: SI ALORS SANS CASE IN MSSQL

Pour commencer, vous devez déterminer les valeurs de true et false pour les conditions sélectionnées. Voici deux NULLIF :

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

combinés ensemble donne 1 ou 0. Utilisez ensuite opérateurs au niveau des bits .

C'est la méthode la plus WYSIWYG .

23
Tomasito

Utilisez une instruction CASE:

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

Ce n'est pas une réponse, mais un exemple d'instruction CASE en cours d'utilisation. Il a une instruction CASE imbriquée. Maintenant, vous savez pourquoi mes yeux sont croisés. 

 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

Si vous insérez des résultats dans une table pour la première fois, plutôt que de transférer des résultats d'une table à une autre, cela fonctionne dans 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
Robert B. Grossman

Une solution alternative à l'approche CASE utilisant une table d'instructions peut être utilisée.

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 

Résultat:

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

Pour ceux qui utilisent SQL Server 2012, IIF est une fonctionnalité ajoutée qui fonctionne comme une alternative aux instructions Case.

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

SELECT CAST (CASE WHEN Obsolete = 'N' ou InStock = 'Y' ALORS DONNANT 0 bit END AS) comme vendable, * à partir du produit

0
gii96

Vous pouvez avoir deux choix pour que cela soit réellement mis en œuvre:

1) Utilisation de IIF, introduite à partir de SQL 2012:

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

2) Utilisation de Select Case:

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

Question ... SELECT IF (Obsolete = 'N' OR InStock = 'Y'? 1: 0) VENTABLE, * FROM Produit

ANSI: Sélectionnez la casse lorsque p.Obsolete = 'N' ou p.InStock = 'Y' puis 1 sinon 0 finit comme vendable, p. * FROM Produit p;

L'utilisation d'alias - p dans ce cas-ci - aidera à prévenir les problèmes.

0
David Cohn