2017-05-03 56 views
0

的函数语句我有如下表:T-SQL WHERE参数

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' 

显然它不只是两个字段或参数...
我如何写一个有效的查询,以检查所有的情况?

回答

1
SELECT * 
FROM TABLE1 
WHERE 
    (TYPE = @TYPE OR @TYPE='*') 
AND 
    (COLOR = @COLOR OR @COLOR='*') 
0

如果按许多值过滤,则可以构建动态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; 
    

这是很好的,因为在最后的声明中只指定了包括过滤。在一些复杂的过滤情况下,这可以提高性能。

几个重要事项:

  • 你不能在函数中使用此,仅存储过程(这是限制);
  • 你需要在字符串中逃脱单引号(采用双单引号)
  • 如果你的参数值是一个数字,你需要将其转换为字符串