J'ai une procédure stockée qui extrait les informations d'une table en fonction de 4 paramètres.
Je souhaite obtenir des valeurs basées sur les paramètres, mais si un paramètre est NULL, il n'est pas coché. Donc, si tous les 4 paramètres sont nuls, je montrerais la table entière.
Voici mon SP (comme vous pouvez le voir, cela ne fonctionne que pour un paramètre atm):
CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
IF(@Param1 IS NULL)
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable
END
ELSE
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%'
END
END
Y a-t-il un moyen de faire ceci sans avoir une IF
pour chaque combinaison possible (15 FI)?
Que diriez-vous de quelque chose comme
SELECT Id, col1, col2, col3, col4
FROM myTable
WHERE col1 LIKE @Param1+'%'
OR @Param1 IS NULL
dans ce cas précis, vous auriez également pu utiliser
SELECT Id, col1, col2, col3, col4
FROM myTable
WHERE col1 LIKE ISNULL(@Param1,'')+'%'
Mais en général, vous pouvez essayer quelque chose comme
SELECT Id, col1, col2, col3, col4
FROM myTable
WHERE (condition1 OR @Param1 IS NULL)
AND (condition2 OR @Param2 IS NULL)
AND (condition3 OR @Param3 IS NULL)
...
AND (conditionN OR @ParamN IS NULL)
Si vous voulez dire que @ param1 est un paramètre pour col1, @ param2 est un paramètre pour col2, ... etcVous pouvez essayer ceci:
CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
declare @query nvarchar(4000)
SET @query='SELECT Id, col1, col2, col3, col4 FROM myTable '+
(case when ((@Param1 is null) and (@Param2 is null) and (@Param3 is null) and (@Param4 is null))
then ''
else
'where '+
(case when @Param1 is not null
then ' col1 like '''+@param1+'%'''+
(case when @param2 is not null then ' AND ' else '' end)
else '' end)+
(case when @Param2 is not null
then ' col2 like '''+@param2+'%'''+
(case when @param3 is not null then ' AND ' else '' end)
else '' end)+
(case when @Param3 is not null
then ' col3 like '''+@param3+'%'''+
(case when @param4 is not null then ' AND ' else '' end)
else '' end)+
(case when @Param4 is not null
then ' col4 like '''+@param4+'%'''
else '' end)
end)
exec sp_sqlexec @query
CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
IF(@Param1 IS NULL)
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable
END
ELSE
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%' OR @Param1 is Null
END
END
Cela devrait aider
cordialement
Ashutosh Arya
Ajouter une condition dans où et en utilisant CASE .. WHEN .. THEN..
ESSAYEZ DE LA MANIÈRE SUIVANTE.
select col1,col2,...colN..from Table
Where clm1 = CASE WHEN @PARAMETER = 0 THEN **COL1** ELSE **@PARAMETER**
UNE FOIS QUE VOUS AVEZ INDIQUÉ LE NOM DE LA COLONNE DANS UN ÉTAT, VOUS RECHERCHEZ TOUTES LES DONNÉES DU TABLEAU, SI VOUS VOULEZ PASSER EN TANT QUE PARAMÈTRE, PUIS RÉCUPÉRER LES VALEURS DE CONDITION DU TABLEAU.
Vous pouvez utiliser la fonction COALESCE()
dans SQL Server. Vous n'avez pas besoin d'utiliser IF- Else
ou CASE
dans vos déclarations. Voici comment utiliser la fonction COALESCE
.
SELECT Id, col1, col2, col3, col4 FROM myTable where col1 = COALESCE(NULLIF(@param1, ''), col1) and col2 = COALESCE(NULLIF(@param2, ''), col2) and col3 = COALESCE(NULLIF(@param3, ''), col3) and col4=
COALESCE(NULLIF(@param4, ''), col4)
La fonction COALESCE
dans SQL renvoie la première expression non NULL parmi ses arguments. Ici, par exemple, si @ param1 est égal à null, la fonction retournera col1, ce qui conduira à col1 = col1 dans l'instruction where, comme 1 = 1, ce qui signifie que la condition sera toujours vraie.