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
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
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
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 :)
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.
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
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.
À 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
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
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.
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.
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
etCHECK
mais pasSELECT
.7 votes
La réponse de @MartinSmith est la plus élégante : utilisez IIF dans SQL 2012+.