SQL - Conditional WHERE clause

后端 未结 7 1936
庸人自扰
庸人自扰 2020-12-17 04:36

I have a SQL Server 2005 stored procedure that performs a query. This stored procedure takes in three parameters. The parameters are as follows:

@Stat

相关标签:
7条回答
  • 2020-12-17 04:54

    there is no "right way", it depends on many factors, here is a great article describing the PROs and CONs of each way to have dynamic search conditions:

    http://www.sommarskog.se/dyn-search.html

    0 讨论(0)
  • 2020-12-17 04:54

    One way:

    SELECT * 
    FROM Customer c 
    WHERE c.StateID=@StateID 
        AND (@CountyID IS NULL OR c.CountyID=@CountyID)
        AND (@CityID IS NULL OR c.CityID=@CityID)
    

    Another way:

    SELECT * 
    FROM Customer c 
    WHERE c.StateID=@StateID 
        AND c.CountyID=ISNULL(@CountyID, c.CountyID)
        AND c.CityID=ISNULL(@CityID, c.CityId)
    
    0 讨论(0)
  • 2020-12-17 04:56
    SELECT * 
    FROM Customer c 
    WHERE c.StateID=@StateID 
    AND c.CountyID= ISNULL(@CountyID, c.CountyID) 
    AND c.CityID = ISNULL(@CityID, c.CityID)
    
    0 讨论(0)
  • 2020-12-17 05:04
     SELECT * FROM Customer c WHERE (c.StateID=@StateID) AND ((c.CountyID=@CountyID) OR (@CountyID IS NULL)) AND ((c.CityID=@CityID) OR (@CityID IS NULL))
    
    0 讨论(0)
  • 2020-12-17 05:07

    Try it with coalesce, I think it's a very elegant, clean approach:

    SELECT *
    FROM Customer c
    WHERE
     c.StateID=@StateID 
     AND c.CountyID = COALESCE(@CountyID, c.CountyID)
     AND c.CityID = COALESCE(@CityID, c.CityID)
    

    (Be aware though - this will filter out records with nulls in CountyID or CityID.)

    0 讨论(0)
  • 2020-12-17 05:10

    Couple those with some OR statements:

    SELECT *
    FROM
        Customer c
    WHERE
        c.StateID=@StateID
        AND ( c.CountyID=@CountyID OR @CountyID IS NULL )
        AND ( c.CityID=@CityID OR @CityID IS NULL )
    

    For each of those parameters, if it is null, then the check is basically ignored.

    0 讨论(0)
提交回复
热议问题