web-dev-qa-db-fra.com

SQL ignore une partie de WHERE si le paramètre est null

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)?

17
Johan Hjalmarsson

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)
32
Adriaan Stander

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
3
Fauzi88
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

2
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.

0
Mayur

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.

0
Aamir