【问题标题】:T-SQL WHERE statement in function of parameter参数函数中的 T-SQL WHERE 语句
【发布时间】:2017-05-03 11:12:49
【问题描述】:

我有下表:

TABLE1
| ID | NAME   | TYPE  | COLOR  |
|  1 | APPLE  | FRUIT | RED    |
|  2 | BANANA | FRUIT | YELLOW |
|  3 | LEMON  | FRUIT | YELLOW |
|  4 | TOMATO | VEGET | RED    |
|  5 | PEPPER | VEGET | RED    |
|  6 | PEAR   | FRUIT | GREEN  |

还有输入字段@TYPE 和@COLOR。 如果@TYPE = '*'@COLOR = '*' 那么:

SELECT *
FROM TABLE1

否则,如果@TYPE = 'VEGET'@COLOR = '*'

SELECT *
FROM TABLE1
WHERE TYPE = 'VEGET'

如果@TYPE = '*'@COLOR = 'YELLOW'

SELECT *
FROM TABLE1
WHERE COLOR = 'YELLOW'

最后一种情况,如果@TYPE = 'VEGET'@COLOR = 'YELLOW'

SELECT *
FROM TABLE1
WHERE TYPE = 'VEGET'
AND COLOR = 'YELLOW'

显然它不仅仅是两个字段或参数...
如何编写高效的查询来检查所有案例?

【问题讨论】:

    标签: tsql where-clause


    【解决方案1】:
    SELECT *
    FROM TABLE1
    WHERE 
       (TYPE = @TYPE OR @TYPE='*')
    AND
       (COLOR = @COLOR OR @COLOR='*')
    

    【讨论】:

      【解决方案2】:

      如果您按多个值进行过滤,您可以构建动态T-SQL 语句。例如:

      1. 首先声明基本语句:

        DECLARE @DynamicSQLStatement NVARCHAR(MAX);
        
        SET @DynamicSQLStatement = 'SELECT * FROM TABLE1'
        
      2. 然后检查是否应用了过滤(如果是,添加WHERE):

        IF @Type <> '*' OR <> @Color <> '*' OR ...
        BEGIN;
            SET @DynamicSQLStatement =  @DynamicSQLStatement + ' WHERE 1=1 ';
        END;
        
      3. 然后为每个参数添加检查:

        IF @Type <> '*' 
        BEGIN;
            SET @DynamicSQLStatement =  @DynamicSQLStatement + ' AND @Type = ' + @Type; 
        END;
        
        IF @Color <> '*' 
        BEGIN;
            SET @DynamicSQLStatement =  @DynamicSQLStatement + ' AND @Color = ' + @Color; 
        END;
        
      4. 最后,执行语句:

        EXEC sp_executesql @DynamicSQLStatement;
        

      这很好,因为在最后的语句中只包含指定的过滤。在一些复杂的过滤场景中,这可以提高性能。

      几个重要的注意事项:

      • 你不能在函数中使用这个,只能在存储过程中使用(这是限制);
      • 需要对字符串中的单引号进行转义(使用双单引号)
      • 如果你的参数值是一个数字,你需要把它转换成字符串

      【讨论】:

        猜你喜欢
        • 2010-12-05
        • 1970-01-01
        • 2015-02-24
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-27
        相关资源
        最近更新 更多