用4种可能的路径编写查询的更好方法是什么?

时间:2010-02-12 21:30:13

标签: sql sql-server

可能不是最好的头衔但反正..

我有一个存储过程,直到现在有一​​个可选参数,我很容易用1 if语句解决。现在它有2个,最多可以有4个if语句。我想知道是否有更好的方法来编写查询,然后如下。特别是当变量计数达到4或5时。

我正在寻找一种更简单的方法来添加这个新的ignoreTheseIds变量,而不必再添加2个if / else语句。

ALTER PROCEDURE [dbo].[SomeQuery]
    @StartingDate varchar(10) = '1/1/1900',
    @EndingDate varchar(10) = NOW,
    @LimitToTheseIds varchar(MAX) = ''
    @IgnoreTheseIds varchar(MAX) = ''
AS

BEGIN
    SET NOCOUNT ON;

    IF @LimitTo = ''
    BEGIN
        SELECT id1, col2
        FROM Table1 as T
        WHERE SomeDateTime <= @EndDate
          AND SomeDateTime >= @StartDate
    END
    ELSE
    BEGIN
        SELECT id1, col2
        FROM Table1 as T
        WHERE SomeDateTime <= @EndDate
            AND SomeDateTime >= @StartDate
            AND @LimitToTheseIds LIKE '%|' + CAST(id1 as varchar) + '|%'
    END
END

希望在更改var名称时没有弄乱任何东西...

5 个答案:

答案 0 :(得分:2)

您可以检查是否传递了任何内容:

ALTER PROCEDURE [dbo].[SomeQuery] 
    @StartingDate varchar(10) = '1/1/1900', 
    @EndingDate varchar(10) = NOW, 
    @LimitToTheseIds varchar(MAX) = '' 
    @IgnoreTheseIds varchar(MAX) = '' 
AS 

BEGIN 
    SET NOCOUNT ON; 

    SELECT id1, col2 
    FROM Table1 as T 
    WHERE SomeDateTime <= @EndDate 
        AND SomeDateTime >= @StartDate 
        AND (@LimitToTheseIds LIKE '%|' + CAST(id1 as varchar) + '|%' 
        OR @LimitToTheseId = '')
END 

答案 1 :(得分:2)

这是我遇到的关于动态搜索条件的最全面的文章:

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

答案 2 :(得分:0)

您可以使用CASE语句,但是您需要检查是否通过这样做来提高效率。像这样:

ALTER PROCEDURE [dbo].[SomeQuery]
    @StartingDate varchar(10) = '1/1/1900',
    @EndingDate varchar(10) = NOW,
    @LimitToTheseIds varchar(MAX) = ''
    @IgnoreTheseIds varchar(MAX) = ''
AS

BEGIN
    SET NOCOUNT ON;

    SELECT id1, col2
    FROM Table1 as T
    WHERE SomeDateTime <= @EndDate
        AND SomeDateTime >= @StartDate
        AND @LimitToTheseIds LIKE CASE WHEN @LimitToTheseIds = '' THEN '' ELSE '%|' + CAST(id1 as varchar) + '|%' END
        AND @IgnoreTheseIds LIKE CASE WHEN @IgnoreTheseIds = '' THEN '' ELSE /*something appropriate here*/
END

答案 3 :(得分:0)

  SELECT id1, col2
FROM Table1 as T
WHERE SomeDateTime <= @EndDate
    AND SomeDateTime >= @StartDate
AND (@LimitToTheseIds IS NULL OR @LimitToTheseIds LIKE '%|' + CAST(id1 as varchar) + '|%')

答案 4 :(得分:-1)

当我不得不像这样编写更大的SPROCS时,我添加了一个“Type”变量,该变量将转到SPROC中的特定语句。例如:

@queryType = 'A'

if @queryType = 'A'
 begin
  --do query A
 end

if @queryType = 'B'
 begin
  --do query B
 end

--etc.

它最终比拥有多棵树更清洁。