Est-il possible d'utiliser une clause IF dans une clause WHERE dans MS SQL?
Exemple:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
Est-il possible d'utiliser une clause IF dans une clause WHERE dans MS SQL?
Exemple:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
Réponses:
Utilisez une instruction CASE
UPDATE: la syntaxe précédente (comme l'ont souligné quelques personnes) ne fonctionne pas. Vous pouvez utiliser CASE comme suit:
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber) = 1 THEN
@OrderNumber
ELSE
'%' + @OrderNumber
END
Ou vous pouvez utiliser une instruction IF comme le souligne @ NJ Reed .
CASE
est la solution appropriée dans la plupart des cas. Dans mon cas, je voulais changer d'opérateur de comparaison et j'ai donc utilisé l'approche suivante.
Vous devriez pouvoir le faire sans IF ni CAS
WHERE
(IsNumeric(@OrderNumber) AND
(CAST OrderNumber AS VARCHAR) = (CAST @OrderNumber AS VARCHAR)
OR
(NOT IsNumeric(@OrderNumber) AND
OrderNumber LIKE ('%' + @OrderNumber))
Selon la version de SQL, vous devrez peut-être modifier les transtypages du numéro de commande en INT ou VARCHAR, selon que les transtypages implicites sont pris en charge.
Il s'agit d'une technique très courante dans une clause WHERE. Si vous souhaitez appliquer une logique "IF" dans la clause WHERE, tout ce que vous devez faire est d'ajouter la condition supplémentaire avec un booléen AND à la section où elle doit être appliquée.
Vous n'avez pas du tout besoin d'une instruction IF.
WHERE
(IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber)
OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')
where (@AdmUserId is null or CurrentOrder.CustomerAdmUserId = @AdmUserId)
Ou filtre uniquement si IncludeDeleted = 0: where (@IncludeDeleted = 1 or ItemObject.DeletedFlag = 0)
Il n'y a pas de bon moyen de le faire en SQL. Quelques approches que j'ai vues:
1) Utilisez CASE combiné avec des opérateurs booléens:
WHERE
OrderNumber = CASE
WHEN (IsNumeric(@OrderNumber) = 1)
THEN CONVERT(INT, @OrderNumber)
ELSE -9999 -- Some numeric value that just cannot exist in the column
END
OR
FirstName LIKE CASE
WHEN (IsNumeric(@OrderNumber) = 0)
THEN '%' + @OrderNumber
ELSE ''
END
2) Utilisez des IF en dehors de SELECT
IF (IsNumeric(@OrderNumber)) = 1
BEGIN
SELECT * FROM Table
WHERE @OrderNumber = OrderNumber
END ELSE BEGIN
SELECT * FROM Table
WHERE OrderNumber LIKE '%' + @OrderNumber
END
3) À l'aide d'une longue chaîne, composez votre instruction SQL de manière conditionnelle, puis utilisez EXEC
La 3ème approche est hideuse, mais c'est presque la seule pensée qui fonctionne si vous avez un certain nombre de conditions variables comme ça.
IF...ELSE...
conditionnels en booléens AND
et OR
comme dans la réponse @ njr101 ci-dessus. L'inconvénient de ^ cette approche est qu'il peut être extrêmement difficile si vous en avez plusieurs IF
ou si vous en avez plusieurs qui sont imbriqués
Utilisez une instruction CASE au lieu de IF.
Vous voulez l'instruction CASE
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END
Je pense que là où ... comme / = ... cas ... alors ... peut fonctionner avec des booléens. J'utilise T-SQL.
Scénario: Supposons que vous souhaitiez obtenir les passe-temps de la personne 30 si le booléen est faux, et les passe-temps de la personne 42 si le booléen est vrai. (Selon certains, les recherches de passe-temps représentent plus de 90% des cycles de calcul de l'entreprise, alors payez une attention particulière.).
CREATE PROCEDURE sp_Case
@bool bit
AS
SELECT Person.Hobbies
FROM Person
WHERE Person.ID =
case @bool
when 0
then 30
when 1
then 42
end;
OERE (IsNumeric (@OrderNumber) <> 1 OU OrderNumber = @OrderNumber) AND (IsNumber (@OrderNumber) = 1 OU OrderNumber LIKE '%' + @OrderNumber + '%')
IF P THEN Q ELSE R
<=>
( ( NOT P ) OR Q ) AND ( P OR R )
La déclaration CASE est toujours meilleure que IF .
WHERE vfl.CreatedDate >= CASE WHEN @FromDate IS NULL THEN vfl.CreatedDate ELSE @FromDate END
AND vfl.CreatedDate<=CASE WHEN @ToDate IS NULL THEN vfl.CreatedDate ELSE @ToDate END
WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE '%' + @OrderNumber END
En ligne, la condition fonctionnera correctement.
L'exemple suivant exécute une requête dans le cadre de l'expression booléenne, puis exécute des blocs d'instructions légèrement différents en fonction du résultat de l'expression booléenne. Chaque bloc d'instructions commence par BEGIN et se termine par END.
USE AdventureWorks2012;
GO
DECLARE @AvgWeight decimal(8,2), @BikeCount int
IF
(SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5
BEGIN
SET @BikeCount =
(SELECT COUNT(*)
FROM Production.Product
WHERE Name LIKE 'Touring-3000%');
SET @AvgWeight =
(SELECT AVG(Weight)
FROM Production.Product
WHERE Name LIKE 'Touring-3000%');
PRINT 'There are ' + CAST(@BikeCount AS varchar(3)) + ' Touring-3000 bikes.'
PRINT 'The average weight of the top 5 Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.';
END
ELSE
BEGIN
SET @AvgWeight =
(SELECT AVG(Weight)
FROM Production.Product
WHERE Name LIKE 'Touring-3000%' );
PRINT 'Average weight of the Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.' ;
END ;
GO
Utilisation d'instructions IF ... ELSE imbriquées L'exemple suivant montre comment une instruction IF… ELSE peut être imbriquée dans une autre. Définissez la variable @Number sur 5, 50 et 500 pour tester chaque instruction.
DECLARE @Number int
SET @Number = 50
IF @Number > 100
PRINT 'The number is large.'
ELSE
BEGIN
IF @Number < 10
PRINT 'The number is small'
ELSE
PRINT 'The number is medium'
END ;
GO
Dans le serveur SQL, j'ai eu le même problème, je voulais utiliser une instruction and uniquement si le paramètre est faux et sur true, je devais afficher les valeurs true et false, donc je l'ai utilisé de cette façon
(T.IsPublic = @ShowPublic or @ShowPublic = 1)
If @LstTransDt is Null
begin
Set @OpenQty=0
end
else
begin
Select @OpenQty=IsNull(Sum(ClosingQty),0)
From ProductAndDepotWiseMonitoring
Where Pcd=@PCd And PtpCd=@PTpCd And TransDt=@LstTransDt
end
Voyez si cela aide.
USE AdventureWorks2012;
GO
IF
(SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5
PRINT 'There are more than 5 Touring-3000 bicycles.'
ELSE PRINT 'There are 5 or less Touring-3000 bicycles.' ;
GO