Comment puis-je effectuer un IF...THEN
dans une instruction SQL SELECT
?
Par exemple:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
L'instruction CASE
est la plus proche de IF 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 devez seulement faire CAST
si vous voulez que le résultat soit une valeur booléenne, si vous êtes satisfait d'une int
, ceci fonctionne:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Les instructions CASE
peuvent être incorporées dans d'autres instructions CASE
et même incluses dans des agrégats.
SQL Server Denali (SQL Server 2012) ajoute l'instruction IIF qui est également disponible dans access : (signalé 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 prolongé:
SELECT CASE WHEN <test> THEN <returnvalue>
WHEN <othertest> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Vous pouvez même mettre des instructions de cas dans une commande d'ordre par clause pour une commande vraiment élégante.
À partir de SQL Server 2012, vous pouvez utiliser la fonction IIF
pour cela.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
En réalité, il s’agit simplement d’une manière abrégée de écrire CASE
.
Je préfère la concision par rapport à la version CASE
étendue.
IIF()
et CASE
résolvent tous les deux des expressions dans une instruction SQL et ne peuvent être utilisés que dans des emplacements bien définis.
L'expression CASE ne peut pas être utilisée pour contrôler le flux d'exécution de Instructions Transact-SQL, blocs d'instructions, fonctions définies par l'utilisateur et procédures stockées.
Si ces limitations ne permettent pas de satisfaire vos besoins (par exemple, la nécessité de renvoyer des ensembles de résultats de formes différentes en fonction de certaines conditions), SQL Server dispose également d'un mot clé IF
Keyword.
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 quelques exemples intéressants dans La puissance des instructions SQL CASE, et je pense que l'instruction que vous pouvez utiliser ressemblera à quelque chose comme ça (from 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
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
De ce link , on peut 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 T-SQL?
Microsoft SQL Server (T-SQL)
Dans une utilisation choisie:
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
Simple instruction if-else dans SQL Server:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
Déclaration imbriquée If ... 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
Une nouvelle fonctionnalité, IIF (que nous pouvons simplement utiliser), a été ajoutée à SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Utilisez une logique de bits pure:
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 Démo de travail: SI ALORS SANS CASE IN MSSQL
Pour commencer, vous devez déterminer les valeurs 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. Utilisez ensuite opérateurs au niveau des bits .
C'est la méthode la plus WYSIWYG .
Utilisez une instruction CASE:
SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
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' )
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, mais un exemple d'instruction CASE en cours d'utilisation. Il a une instruction CASE imbriquée. Maintenant, vous savez 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]
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');
Une solution alternative à l'approche CASE
utilisant une table d'instructions 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
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
Pour ceux qui utilisent SQL Server 2012, IIF est une fonctionnalité ajoutée qui fonctionne comme une alternative aux instructions Case.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
SELECT CAST (CASE WHEN Obsolete = 'N' ou InStock = 'Y' ALORS DONNANT 0 bit END AS) comme vendable, * à partir du produit
Vous pouvez avoir deux choix pour que cela soit réellement mis en œuvre:
1) Utilisation de IIF, introduite à partir de SQL 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
2) Utilisation de 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) VENTABLE, * FROM Produit
ANSI: Sélectionnez la casse lorsque p.Obsolete = 'N' ou p.InStock = 'Y' puis 1 sinon 0 finit comme vendable, p. * FROM Produit p;
L'utilisation d'alias - p dans ce cas-ci - aidera à prévenir les problèmes.