Comment effectuer un IF… THEN dans un SQL SELECT?
-
09-06-2019 - |
Question
Comment puis-je effectuer un SI ... THEN
dans une instruction SQL SELECT
?
Par exemple:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
La solution
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
Il vous suffit de faire le 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
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 Déclaration IIF disponible également dans accès ( souligné par Martin Smith ):
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
Autres conseils
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 instructions case dans une commande order by pour une commande vraiment sophistiquée.
A partir de SQL Server 2012, vous pouvez utiliser le . IIF
pour cela.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Il ne s'agit en réalité que d'une méthode abrégée (bien que non standard SQL) pour écrire CASE
.
Je préfère la concision par rapport à la version CASE
développée.
IIF ()
et CASE
sont résolus en tant qu'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’instruction, 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 formes différentes en fonction de certaines conditions), SQL Server dispose également d'une procédure SI
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 trouverez quelques exemples intéressants dans La puissance de l'instruction SQL CASE , et je pense que la déclaration que vous pouvez utiliser va ressembler à quelque chose comme ça (d'après 4guysfromrolla ):
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
Utilisez CASE. 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
Microsoft SQL Server (T-SQL)
Dans un select
, utilisez:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
Dans une clause où
, utilisez:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
De de ce lien , nous pouvons comprendre SI ALORS ENSUITE
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?
Instruction simple if-else 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
Utilisez une instruction CASE:
SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
Une nouvelle fonctionnalité, IIF (que nous pouvons simplement utiliser) , a été ajouté dans SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Utiliser une logique binaire 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 la démonstration de travail: if alors sans case
dans SQL & nbsp ; Serveur .
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 les opérateurs au niveau du bit .
Il s'agit de la méthode la plus WYSIWYG .
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
Ceci n'est pas une réponse, mais un exemple d'instruction CASE en cours d'utilisation. Il a une déclaration 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 les 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 à l'instruction CASE
, vous pouvez utiliser une approche basée sur les tables:
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
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, vous aidera à éviter les problèmes.
Pour cela, vous pouvez avoir deux choix:
-
Utilisation de IIF, introduite depuis SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
-
Utilisation de
Sélectionner le cas
:SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 END as Saleable, * FROM Product
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product