--> 测试数据: @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解决,指定最小值看起来不太规范。
假如使用程序添加程序条件会方便许多。
是否有其它办法?期待中......
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解决,指定最小值看起来不太规范。
假如使用程序添加程序条件会方便许多。
是否有其它办法?期待中......
SET @s = null if @s is null
SELECT * FROM @tb
else
SELECT * FROM @tb WHERE value1 >3
如果@s=NULL WHERE 后面 不添加‘value1>@s’ 的条件,直接查所有
SET @s = 3
SELECT * FROM @tb
WHERE 1= isnull(@s,1) or value1 >@s
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 行)*/
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)
DECLARE @s INT
SET @s = 3
SELECT * FROM @tb
WHERE 'A'= isnull(LTRIM(@s),'A') or value1 >@s
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出来了。 不知道有没有好办法。