where 条件筛选

发热鼠标垫 2009-12-02 02:54:34
--> 测试数据: @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 @tb

DECLARE @s INT
SET @s = null
SELECT * FROM @tb

WHERE 1=1 and value1 >3

上面的结果不对,想@s=null时,查出所有结果,没有value1查询条件的干扰。@s=3时,查出value1大于3的结果。

规定条件:把查询语句放在新定义的字符串里本例子可以解决,但实际查询语句很多,而且又是子查询,不方便使用。
@s为null时可以设置valu1>最小的value1解决,指定最小值看起来不太规范。
假如使用程序添加程序条件会方便许多。
是否有其它办法?期待中......
...全文
136 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
发热鼠标垫 2009-12-02
  • 打赏
  • 举报
回复
--> 测试数据: @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 @tb



DECLARE @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出来了。

不知道有没有好办法。
发热鼠标垫 2009-12-02
  • 打赏
  • 举报
回复
存储过程可能没几百行,但比较多的意思。

无论是否查询,都要显示value1 为null 的行。

原来还有一个条件 来筛选value2 的值。

发热鼠标垫 2009-12-02
  • 打赏
  • 举报
回复
原来是有几百行的存储过程,其中有一个好几级的子查询,要在子查询的结果里筛选存储过程出入的参数。

不修改别的地方,只在子查询的where 条件后面添加查询 是 我最想要的办法。

谢谢各位了。

csdn 高手真多呀。呵呵。
百年树人 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 josy 的回复:]
SQL codeDECLARE@sINTSET@s=3SELECT*FROM@tbWHERE1=isnull(@s,1)or value1>@s
[/Quote]
避免出现@s=1的情况
DECLARE @s INT 
SET @s = 3
SELECT * FROM @tb
WHERE 'A'= isnull(LTRIM(@s),'A') or value1 >@s
华夏小卒 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 josy 的回复:]
SQL codeDECLARE@sINTSET@s=3SELECT*FROM@tbWHERE1=isnull(@s,1)or value1>@s
[/Quote]

up
华夏小卒 2009-12-02
  • 打赏
  • 举报
回复
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)
jiangshun 2009-12-02
  • 打赏
  • 举报
回复

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 行)

*/
百年树人 2009-12-02
  • 打赏
  • 举报
回复
DECLARE @s INT 
SET @s = 3
SELECT * FROM @tb
WHERE 1= isnull(@s,1) or value1 >@s
发热鼠标垫 2009-12-02
  • 打赏
  • 举报
回复
如果@s<>NULL WHERE 后面 添加‘value1>@s’ 的条件
如果@s=NULL WHERE 后面 不添加‘value1>@s’ 的条件,直接查所有
dawugui 2009-12-02
  • 打赏
  • 举报
回复
DECLARE @s INT
SET @s = null

if @s is null
SELECT * FROM @tb
else
SELECT * FROM @tb WHERE value1 >3
华夏小卒 2009-12-02
  • 打赏
  • 举报
回复
要什么?
jiangshun 2009-12-02
  • 打赏
  • 举报
回复
@s跟谁作比较?value1吗?
--小F-- 2009-12-02
  • 打赏
  • 举报
回复
没弄懂意思

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧