1669 votes

Comment effectuer un IF...THEN dans un SELECT SQL ?

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

16 votes

Vous voudrez peut-être jeter un coup d'oeil à ceci lien . Concernant : Les clauses SQL WHERE : Évitez les CASE, utilisez la logique booléenne

4 votes

@Somebody : pas vraiment pertinent car l'article parle de l'utilisation de règles de réécriture logique pour convertir une implication en disjonction. L'indice est le mot "logique", c'est-à-dire quelque chose qui se résout en vrai ou faux, ce qui ne s'applique pas à la projection. L'article TL;DR s'applique à WHERE et CHECK mais pas SELECT .

7 votes

La réponse de @MartinSmith est la plus élégante : utilisez IIF dans SQL 2012+.

1921voto

Darrel Miller Points 56797

Le site CASE est ce qui se rapproche le plus de IF en SQL et elle est prise en charge par 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

Il vous suffit de faire le CAST si vous voulez que le résultat soit une valeur booléenne. Si vous vous contentez d'un int cela fonctionne :

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 et même inclus dans les agrégats.

SQL Server Denali (SQL Server 2012) ajoute les fonctionnalités suivantes IIF qui est également disponible dans accès (souligné par Martin Smith ) :

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

61 votes

Juste un mot d'avertissement supplémentaire, n'enfermez pas vos conditions dans les freins lorsque vous utilisez la valise. J'ai mis du temps à m'en rendre compte :)

22 votes

et n'oubliez pas la FIN

0 votes

Bien que cela fonctionne, l'utilisation de la fonction IFF() sera la meilleure solution.

348voto

Jonathan Points 6934

L'énoncé du 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 étendu :

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

Vous pouvez même placer des instructions de cas dans une clause d'ordre par pour obtenir un ordre vraiment fantaisiste.

34 votes

Je sais que c'est vieux, mais je pense qu'il faut noter que l'on peut ajouter un AS Col_Name après le END pour nommer la colonne résultante

9 votes

J'ai toujours l'impression que la deuxième est plus simple.

4 votes

Je suis d'accord, je finis presque toujours par utiliser la déclaration de cas étendue parce que les conditions que je veux tester sont toujours plus complexes que la seule variable elle-même. C'est aussi plus facile à lire pour moi.

297voto

Martin Smith Points 174101

À 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

Il s'agit en fait d'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 version.

Les deux sites IIF() et CASE se résolvent comme des expressions dans une instruction SQL et ne peuvent être utilisées qu'à des endroits bien définis.

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

Si vos besoins ne peuvent pas être satisfaits par ces limitations (par exemple, si vous avez besoin de renvoyer des ensembles de résultats de formes différentes en fonction d'une certaine condition), le serveur SQL dispose également d'une méthode procédurale. 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 faire attention à éviter les problèmes de reniflage de paramètres avec cette approche. .

6 votes

Ceci devrait être la réponse si vous voulez une instruction IF.. then en SQL.

102voto

Sven Points 7277

Vous pouvez trouver de beaux exemples dans La puissance des instructions SQL CASE et je pense que la déclaration que vous pouvez utiliser sera quelque chose comme ceci (à partir de 4guysfromrolla ) :

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

4 votes

voir : meta.stackexchange.com/questions/103053/ pour une discussion intéressante. Les deux liens que vous fournissez ajoutent un contexte supplémentaire, ce que je soutiens.

2 votes

La référence est vraiment utile et fortement recommandée en cas de détails supplémentaires.

79voto

palehorse Points 8268

Utilisez le CASE. Quelque chose comme ça.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X