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

Comment puis-je effectuer un IF...THEN dans une déclaration SQL SELECT ?

par exemple:

SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
1257
demandé sur DineshDB 2008-09-15 18:34:09

23 réponses

la déclaration CASE est la plus proche de si 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 avez seulement besoin de faire le CAST si vous voulez le résultat comme une valeur booléenne, si vous êtes heureux avec un int , cela fonctionne:

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

CASE peuvent être intégrées dans d'autres déclarations CASE et même dans des agrégats.

SQL Server Denali (SQL Server 2012) ajoute le IIF déclaration qui est également disponible dans accès : (souligné par Martin Smith )

SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
1487
répondu Darrel Miller 2017-05-23 11:55:01

la déclaration de cas est votre ami dans cette situation, et prend l'une des deux formes:

le cas simple:

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

L'extension du cas:

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

vous pouvez même mettre des déclarations de cas dans un ordre Par clause pour vraiment commande Fantaisie.

289
répondu Jonathan 2015-10-28 00:07:31

de SQL Server 2012 vous pouvez utiliser le IIF fonction pour cela.

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

ce n'est en fait qu'une façon abrégée (bien que non standard SQL) d'écrire CASE .

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

à la fois IIF() et CASE résoudre comme des expressions dans une déclaration SQL et peut être utilisé uniquement dans des endroits bien définis.

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

si vos besoins ne peuvent pas être satisfaits par ces limitations (par exemple un besoin de retourner des ensembles de résultats de forme différente dépendant d'une certaine condition), alors SQL Server a aussi une procédure IF mot-clé.

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 soin d'éviter les problèmes d'odeur des paramètres avec cette approche.

220
répondu Martin Smith 2017-04-13 12:42:36

vous pouvez trouver de beaux exemples dans la puissance des déclarations de cas de SQL , et je pense que la déclaration que vous pouvez utiliser sera quelque chose comme ceci ( de 4guysfromrolla ):

SELECT
    FirstName, LastName,
    Salary, DOB,
    CASE Gender
        WHEN 'M' THEN 'Male'
        WHEN 'F' THEN 'Female'
    END
FROM Employees
77
répondu sven 2011-05-24 17:31:26

cas D'utilisation. Quelque chose comme cela.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
71
répondu palehorse 2008-09-15 14:37:49
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
44
répondu John Sheehan 2012-03-29 12:36:04
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT
41
répondu Santiago Cepas 2008-09-15 14:37:56

Microsoft SQL Server (T-SQL)

dans un usage restreint:

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

dans une clause where, utiliser:

where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
38
répondu user7658 2008-09-15 14:40:04

de ce lien , nous pouvons 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 le T-SQL ?

38
répondu Ken 2015-11-24 09:31:19

Simple if-else dans SQL Server:

DECLARE @val INT;
SET @val = 15;

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

GO

Imbriqué Si...déclaration 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
28
répondu Ravi Anand 2017-05-21 10:55:36

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

SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
22
répondu sandeep rawat 2017-09-30 00:12:39

Utiliser une instruction de CAS:

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

etc...
21
répondu Krizzy 2016-11-04 12:45:14

Utiliser pur peu de logique:

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 travail de démonstration: SI, ALORS, SANS CAS DANS MSSQL

pour commencer, vous devez calculer la valeur de true et false pour des conditions sélectionnées. Voici deux NULLIF :

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

combiné donne 1 ou 0. Utilisez ensuite opérateurs bitwise .

C'est le plus WYSIWYG method.

21
répondu Tomasito 2017-05-21 10:56:17
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' )
16
répondu onedaywhen 2016-05-11 15:56:30
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
14
répondu atik sarker 2015-08-25 09:44:46
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
12
répondu Chanukya 2015-12-09 12:15:36

ce n'est pas une réponse, juste un exemple d'énoncé de cas utilisé où je travaille. Il a une déclaration emboîtée. Maintenant tu sais 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]
11
répondu JustJohn 2016-10-11 08:00:39

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.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');
10
répondu Robert B. Grossman 2012-10-26 15:30:18
  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
7
répondu SURJEET SINGH Bisht 2016-11-30 11:05:06

pour ceux qui utilisent SQL Server 2012, IIF est une fonctionnalité qui a été ajoutée et fonctionne comme une alternative aux déclarations de cas.

SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM   Product 
6
répondu Dibin 2014-04-07 14:16:17
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product
5
répondu 2017-08-08 21:33:52

comme solution alternative à l'approche basée sur la table de déclaration CASE 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
5
répondu Serkan Arslan 2018-01-31 11:31:07

sélectionner CAST (CASE when Obsolete = 'N' or InStock = ' Y 'THEN ELSE 0 END AS bit) comme vendable, * à partir du produit

0
répondu gii96 2018-10-08 06:34:01