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


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

Par exemple:

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

1221
2017-09-15 14:34


origine


Réponses:


le CASE instruction est la plus proche de IF dans SQL et est pris 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 CAST si vous voulez que le résultat soit une valeur booléenne, si vous êtes satisfait d'un int, cela marche:

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

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

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

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

1457
2017-09-15 14:38



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>

Le cas étendu:

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 une clause d'ordre pour vraiment commander.


282
2017-09-15 15:10



À partir de SQL Server 2012, vous pouvez utiliser le IIF fonction pour ça.

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

C'est en fait un raccourci (bien que pas standard SQL) de l'écriture CASE.

Je préfère la concision par rapport à l'expansion CASE version.

Tous les deux IIF() et CASE résoudre en tant qu'expressions dans une instruction SQL et ne peut être utilisé que dans des endroits bien définis.

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

Si vos besoins ne peuvent pas être satisfaits par ces limitations (par exemple, la nécessité de renvoyer des ensembles de résultats de forme différente en fonction de certaines conditions), SQL Server dispose également d'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 

Cependant, il faut parfois prendre soin d'éviter les problèmes de reniflage des paramètres avec cette approche.


213
2017-07-20 23:39



Vous pouvez trouver de bons exemples dans La puissance des instructions CASE SQL, et je pense que la déclaration que vous pouvez utiliser sera quelque chose comme ça (de 4guysfromrolla):

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

74
2017-09-15 14:39



Cas d'utilisation. Quelque chose comme ça.

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

68
2017-09-15 14:37



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

42
2017-09-15 14:37



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

37
2017-09-15 14:37



Microsoft SQL Server (T-SQL)

Dans une utilisation sélective:

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

35
2017-09-15 14:40



De cette 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 assez bon pour T-SQL?


34
2018-01-06 01:02