Comment puis-je effectuer un IF...puis dans un SQL SELECT?
23 réponses
la déclaration CASE
est la plus proche de si 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 avez seulement besoin de faire le CAST
si vous voulez le résultat comme une valeur booléenne, si vous êtes heureux avec un int
, cela fonctionne:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Les déclarations CASE
peuvent être intégrées dans d'autres déclarations CASE
et même dans des agrégats.
SQL Server Denali (SQL Server 2012) ajoute le IIF déclaration qui est également disponible dans 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:
le cas simple:
SELECT CASE <variable> WHEN <value> THEN <returnvalue>
WHEN <othervalue> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
L'extension du cas:
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 un ordre Par clause pour vraiment commande Fantaisie.
de SQL Server 2012 vous pouvez utiliser le IIF
fonction pour cela.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
ce n'est en fait qu'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
.
à la fois IIF()
et CASE
résoudre comme des expressions dans une déclaration SQL et peut être utilisé uniquement dans des endroits bien définis.
l'expression CASE ne peut pas être utilisée pour contrôler le flux d'exécution de Transact-SQL, de blocs, de fonctions définies par l'utilisateur, et procédures stockées.
si vos besoins ne peuvent pas être satisfaits par ces limitations (par exemple un besoin de retourner des ensembles de résultats de forme différente dépendant d'une certaine condition), alors SQL Server a aussi une procédure 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
il faut parfois prendre soin d'éviter les problèmes d'odeur des paramètres avec cette approche.
vous pouvez trouver de beaux exemples dans la puissance des déclarations de cas de SQL , et je pense que la déclaration que vous pouvez utiliser sera quelque chose comme ceci ( 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 cela.
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 usage restreint:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
dans une clause where, utiliser:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
de ce lien , nous pouvons 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 le T-SQL ?
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
Imbriqué Si...déclaration 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 dans SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Utiliser une instruction de CAS:
SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
Utiliser pur peu de logique:
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 travail de démonstration: SI, ALORS, SANS CAS DANS MSSQL
pour commencer, vous devez calculer la valeur de true
et false
pour des conditions sélectionnées. Voici deux NULLIF :
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
combiné donne 1 ou 0. Utilisez ensuite opérateurs bitwise .
C'est le plus WYSIWYG method.
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, juste un exemple d'énoncé de cas utilisé où je travaille. Il a une déclaration emboîté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]
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.2 g:
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');
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) 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 déclarations de cas.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
comme solution alternative à l'approche basée sur la table de déclaration CASE
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
sélectionner CAST (CASE when Obsolete = 'N' or InStock = ' Y 'THEN ELSE 0 END AS bit) comme vendable, * à partir du produit