--> 测试数据: @tb
declare @tb table (name varchar(1),value1 int,value2 int,value3 int)
insert into @tb
select 'a',1,2,3 union all
select 'b',2,2,3 union all
select 'c',null,2,3 union all
select 'd',-100010,2,1 union all
select 'e',null,2,1 union all
select 'f',3,2,2
--SELECT * FROM @tbDECLARE @s INT
SET @s = null
SELECT * FROM @tbWHERE 1=1 and value1 >3上面的结果不对,想@s=null时,查出所有结果,没有value1查询条件的干扰。@s=3时,查出value1大于3的结果。规定条件:把查询语句放在新定义的字符串里本例子可以解决,但实际查询语句很多,而且又是子查询,不方便使用。
@s为null时可以设置valu1>最小的value1解决,指定最小值看起来不太规范。
假如使用程序添加程序条件会方便许多。
是否有其它办法?期待中......

解决方案 »

  1.   

    DECLARE @s INT 
    SET @s = null if @s is null
       SELECT * FROM @tb 
    else
       SELECT * FROM @tb WHERE  value1 >3 
      

  2.   

    如果@s<>NULL WHERE 后面 添加‘value1>@s’ 的条件
    如果@s=NULL WHERE 后面 不添加‘value1>@s’ 的条件,直接查所有
      

  3.   

    DECLARE @s INT 
    SET @s = 3
    SELECT * FROM @tb 
    WHERE  1= isnull(@s,1) or value1 >@s
      

  4.   


    DECLARE @s INT
    SET @s = 3
    SELECT * FROM @tb WHERE @s is null or value1>=@s /************ SET @s = null(所影响的行数为 6 行)name value1      value2      value3      
    ---- ----------- ----------- ----------- 
    a    1           2           3
    b    2           2           3
    c    NULL        2           3
    d    -100010     2           1
    e    NULL        2           1
    f    3           2           2(所影响的行数为 6 行)*//************ SET @s = 3(所影响的行数为 6 行)name value1      value2      value3      
    ---- ----------- ----------- ----------- 
    f    3           2           2(所影响的行数为 1 行)*/
      

  5.   

    DECLARE @s INT 
    SET @s = null declare @str varchar(100)
    if @s is null 
    set @str='SELECT * FROM tb WHERE 1=1 '
    else
    set @str='SELECT * FROM tb WHERE 1=1 and value1>'+ltrim(@s)
     exec(@s)
      

  6.   

    避免出现@s=1的情况
    DECLARE @s INT 
    SET @s = 3
    SELECT * FROM @tb 
    WHERE  'A'= isnull(LTRIM(@s),'A') or value1 >@s
      

  7.   

    原来是有几百行的存储过程,其中有一个好几级的子查询,要在子查询的结果里筛选存储过程出入的参数。不修改别的地方,只在子查询的where 条件后面添加查询 是 我最想要的办法。谢谢各位了。csdn 高手真多呀。呵呵。
      

  8.   

    存储过程可能没几百行,但比较多的意思。无论是否查询,都要显示value1 为null 的行。原来还有一个条件 来筛选value2 的值。
      

  9.   

    --> 测试数据: @tb
    declare @tb table (name varchar(1),value1 int,value2 int,value3 int)
    insert into @tb
    select 'a',1,12,3 union all
    select 'b',-2,null,3 union all
    select 'c',null,2,3 union all
    select 'd',10,-3332,-1251 union all
    select 'e',null,9,1 union all
    select 'f',3,22,2
    SELECT * FROM @tbDECLARE @s INT ,@t int
    SET @s=4
    SET @t=10
    SELECT * FROM @tb
    WHERE 1=1 
    AND 'A'=isnull(LTRIM(@s),'A') or value1>@s OR value1 IS NULL
     AND 'b'=isnull(LTRIM(@t),'b') or value2>@t OR value2 IS NULL 查询结果 value2 里的-3332出来了。 不知道有没有好办法。