Comment effectuer un IF...THEN
dans une SQL SELECT
déclaration?
Par exemple:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
et CHECK
non SELECT
.
Comment effectuer un IF...THEN
dans une SQL SELECT
déclaration?
Par exemple:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
et CHECK
non SELECT
.
Réponses:
L' CASE
instruction est la plus proche de IF dans 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 n'avez besoin de le faire que CAST
si vous voulez que le résultat soit une valeur booléenne. Si vous êtes satisfait d'un int
, cela fonctionne:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
CASE
les instructions peuvent être intégrées dans d'autres CASE
instructions et même incluses dans des agrégats.
SQL Server Denali (SQL Server 2012) ajoute l' instruction IIF qui est également disponible en accès (souligné par Martin Smith ):
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
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 é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 order by pour un classement vraiment sophistiqué.
AS Col_Name
après le END
pour nommer la colonne résultante
À partir de SQL Server 2012, vous pouvez utiliser la IIF
fonction pour cela.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Il s'agit en fait d'une manière d'écriture abrégée (bien que non standard SQL) CASE
.
Je préfère la concision par rapport à la CASE
version étendue .
Les deux IIF()
et CASE
résolvent en tant qu'expressions dans une instruction SQL et ne peuvent être utilisés qu'à des endroits bien définis.
L'expression CASE ne peut pas être utilisée pour contrôler le flux d'exécution des instructions Transact-SQL, des blocs d'instructions, des fonctions définies par l'utilisateur et des procédures stockées.
Si vos besoins ne peuvent pas être satisfaits par ces limitations (par exemple, un besoin de renvoyer des jeux de résultats de forme différente en fonction d'une condition), SQL Server possède également un IF
mot-clé procédural .
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 bons exemples dans The Power of SQL CASE Statements , 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
Cas d'utilisation. Quelque chose comme ça.
SELECT Salable =
CASE Obsolete
WHEN 'N' THEN 1
ELSE 0
END
SELECT
(CASE
WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
ELSE 'NO'
END) as Salable
, *
FROM Product
Microsoft SQL Server (T-SQL)
Dans un select
, utilisez:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
Dans une where
clause, utilisez:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
where Obsolete = 'N' or InStock = 'Y'
et couper le où en deux pratiquement
A partir de ce lien , nous pouvons comprendre IF THEN ELSE
en 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?
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
Instruction if-else simple dans SQL Server:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
Instruction Nested If ... else dans SQL Server -
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
SELECT
comme l'OP l'a demandé?
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
Utilisez une logique de bits purs:
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 la démonstration de travail: si alors sans case
dans SQL Server .
Pour commencer, vous devez déterminer la valeur 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. Ensuite, utilisez des opérateurs au niveau du bit .
C'est la méthode la plus WYSIWYG .
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
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
Ce n'est pas une réponse, juste un exemple d'une instruction CASE utilisée lorsque je travaille. Il a une instruction CASE imbriqué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]
CASE
demande juste pourquoi devenir voté et marqué comme une réponse au lieu de ce IF
qui aurait dû être la réponse, comme celle-ci, c'est toujours une CASE
déclaration, pas une IF
.
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');
Comme solution alternative à la CASE
déclaration, une approche basée sur les tables 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
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0
END AS Saleable, *
FROM Product
Pour ceux qui utilisent SQL Server 2012, IIF est une fonctionnalité qui a été ajoutée et fonctionne comme une alternative aux instructions Case.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
Vous pouvez avoir deux choix pour que cela soit réellement implémenté:
En utilisant IIF, qui a été introduit à partir de SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
En utilisant Select Case
:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Question:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
ANSI:
Select
case when p.Obsolete = 'N'
or p.InStock = 'Y' then 1 else 0 end as Saleable,
p.*
FROM
Product p;
L'utilisation d'alias - p
dans ce cas - permettra d'éviter les problèmes.
L'utilisation de SQL CASE est similaire aux instructions If / Else normales. Dans la requête ci-dessous, si la valeur obsolète = 'N' ou si la valeur InStock = 'Y', alors la sortie sera 1. Sinon, la sortie sera 0. Ensuite, nous mettons cette valeur 0 ou 1 sous la colonne vendable.
SELECT
CASE
WHEN obsolete = 'N' OR InStock = 'Y'
THEN 1
ELSE 0
END AS Salable
, *
FROM PRODUCT
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product
Ce sera quelque chose comme ça:
SELECT OrderID, Quantity,
CASE
WHEN Quantity > 30 THEN "The quantity is greater than 30"
WHEN Quantity = 30 THEN "The quantity is 30"
ELSE "The quantity is under 30"
END AS QuantityText
FROM OrderDetails;
SELECT OrderID, Quantity, CASE WHEN Quantity > 30 THEN "The quantity is greater than 30" WHEN Quantity = 30 THEN "The quantity is 30" ELSE "The quantity is under 30" END AS QuantityText FROM OrderDetails WHERE QuantityText = 'The quantity is 30';
Par souci d'exhaustivité, j'ajouterais que SQL utilise une logique à trois valeurs. L'expression:
obsolete = 'N' OR instock = 'Y'
Pourrait produire trois résultats distincts:
| obsolete | instock | saleable |
|----------|---------|----------|
| Y | Y | true |
| Y | N | false |
| Y | null | null |
| N | Y | true |
| N | N | true |
| N | null | true |
| null | Y | true |
| null | N | null |
| null | null | null |
Ainsi, par exemple, si un produit est obsolète mais que vous ne savez pas si le produit est en stock, vous ne savez pas si le produit est vendable. Vous pouvez écrire cette logique à trois valeurs comme suit:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
ELSE NULL
END AS saleable
Une fois que vous avez compris comment cela fonctionne, vous pouvez convertir trois résultats en deux résultats en décidant du comportement de null. Par exemple, cela traiterait null comme non vendable:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
ELSE 'false' -- either false or null
END AS saleable
J'aime l'utilisation des instructions CASE mais la question demandait une instruction IF dans le SQL Select. Ce que j'ai utilisé dans le passé a été:
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
C'est comme les instructions IF Excel ou Sheet où il y a une conditionnelle suivie de la vraie condition puis de la fausse condition:
if(condition, true, false)
De plus, vous pouvez imbriquer les instructions if (mais alors utiliser doit utiliser un CASE :-)
(Remarque: cela fonctionne dans MySQLWorkbench mais peut ne pas fonctionner sur d'autres plates-formes)
Vous pouvez utiliser la déclaration de cas:
Select
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product