请问能不能在Where 后面用Case when 语句,

hz03zhuhaowen 2010-09-29 11:01:12
请问能不能在Where 后面用Case when 语句,

如果不能,有没有相当做法(麻烦举个例)。
...全文
29588 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
njlywy 2010-09-29
  • 打赏
  • 举报
回复 1
完全可以,只要语法不出错…
SQLCenter 2010-09-29
  • 打赏
  • 举报
回复
select * from syscolumns where (case colid when 0 then 1 end) = 1
siegebaoniu 2010-09-29
  • 打赏
  • 举报
回复
恩,只要语法正确。不冲突
ws_hgo 2010-09-29
  • 打赏
  • 举报
回复
select * from tb
where col1='aa'
order by
case when col='***' then '***' else '***' end
ws_hgo 2010-09-29
  • 打赏
  • 举报
回复
select * from tb
where (case when col='***' then '***' else '***' end)='***'
fpzgm 2010-09-29
  • 打赏
  • 举报
回复
select case when '**' then '**' else '**' end as a
union case when '**' then '**' else '**' end as a
where case when '**' then '**' else '**' end
and case when '**' then '**' else '**' end
order by case when '**' then '**' else '**' end
fpzgm 2010-09-29
  • 打赏
  • 举报
回复
select case when '**' then '**' else '**' end as a
union case when '**' then '**' else '**' end as a
where case when '**' then '**' else '**' end
and case when '**' then '**' else '**' end
order by case when '**' then '**' else '**' end
lanchangsheng 2010-09-29
  • 打赏
  • 举报
回复
发错地方了
gentlelhn 2010-09-29
  • 打赏
  • 举报
回复
学习.
lanchangsheng 2010-09-29
  • 打赏
  • 举报
回复
/*
看不懂里面的关键字都是什么意思?
“device”、“USE master”、“sp_addumpdevice 'disk'”、 'testBack'、'c:\mssql7backup\MyNwind_1.dat'、“BACKUP”、“pubs TO testBack”。

"USE master" 运行master数据库
"sp_addumpdevice" 函数 将备份设备添加到 Microsoft? SQL Server?。
"disk" "硬盘文件作为备份设备"
"testBack" 任意名称
"c:\mssql7backup\MyNwind_1.dat" 备份设备物理路径
"BACKUP" 备份关键字
"pubs TO testBack" 将pubs数据库备份到"testBack"磁盘
*/

--备份数据库
--运行marster数据库 主数据库
USE master

--创建一个转储设备
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack


这种备份用的好少
coleling 2010-09-29
  • 打赏
  • 举报
回复
你那样直接写不行,建议你这样写(应该和你的要求相符):

WHERE
WATRDJ>= case when P05_TRDJ_FM is not null then V_TRDJ_FM else WATRDJ end and
WATRDJ<= case when P05_TRDJ_TO is not null then V_TRDJ_TO else WATRDJ end
abuying 2010-09-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hz03zhuhaowen 的回复:]

SQL code

--WHERE WATRDJ BETWEEN V_TRDJ_FM AND V_TRDJ_TO
WHERE (case
when P05_TRDJ_FM is not null or P05_TRDJ_TO is not null then WATRDJ>=V_TRDJ_FM and WATRDJ <= V_TRDJ_TO
when P0……
[/Quote]

这样不行的。
case when 条件 then 值或者表达式
你的WATRDJ>=V_TRDJ_FM是一个判定条件,返回true,false不确定值。

huanghe63 2010-09-29
  • 打赏
  • 举报
回复
请看执行计划,CASE WHEN 其实相当于产生了一个列,最后WHERE 再按那个列来限定

SELECT * AS A FROM TB WHERE CASE WHEN 1=1 THEN 1 ELSE 0 END =1

SELECT * FROM (SELECT * ,CASE WHEN 1=1 THEN 1 ELSE 0 END AS A FROM TB) T WHERE A=1
coleling 2010-09-29
  • 打赏
  • 举报
回复
你那样直接写不行,建议你这样写:

WHERE
WATRDJ>= case when P05_TRDJ_FM is not null or P05_TRDJ_TO is not null then V_TRDJ_FM else WATRDJ end and
WATRDJ<= case when P05_TRDJ_FM is not null or P05_TRDJ_TO is not null then V_TRDJ_TO else WATRDJ end
lanchangsheng 2010-09-29
  • 打赏
  • 举报
回复
一个CASE WEHN 引发的。。。 上顶的回答都顶起。 来接分了
Rotel-刘志东 2010-09-29
  • 打赏
  • 举报
回复
----可以用case when 的
select * from tb
where (case when A>1 then B else 0 end)='col'
hz03zhuhaowen 2010-09-29
  • 打赏
  • 举报
回复

--WHERE WATRDJ BETWEEN V_TRDJ_FM AND V_TRDJ_TO
WHERE (case
when P05_TRDJ_FM is not null or P05_TRDJ_TO is not null then WATRDJ>=V_TRDJ_FM and WATRDJ <= V_TRDJ_TO
when P05_TRDJ_FM is not null and P05_TRDJ_TO is null then WATRDJ>=V_TRDJ_FM
when P05_TRDJ_FM is null or P05_TRDJ_TO is not null then WATRDJ <= V_TRDJ_TO
when P05_TRDJ_FM is null and P05_TRDJ_TO is null then 1=1 end)


case when 语句主要是如下意思:
如果存储过程参数下单起始时间P05_TRDJ_FM不为空,并且截止时间P05_TRDJ_TO不为空,那么相当于
WHERE WATRDJ BETWEEN V_TRDJ_FM AND V_TRDJ_TO
如果存储过程参数下单起始时间P05_TRDJ_FM不为空,并且截止时间P05_TRDJ_TO为空,那么相当于
WHERE WATRDJ>=V_TRDJ_FM
如果存储过程参数下单起始时间P05_TRDJ_FM为空,并且截止时间P05_TRDJ_TO不为空,那么相当于
WHERE WATRDJ <= V_TRDJ_TO
如果存储过程参数下单起始时间P05_TRDJ_FM,截止时间P05_TRDJ_TO均为空,那么相当于
where 1=1
我想实现以上需求,请问SQL脚本这么做行不行?
jamk 2010-09-29
  • 打赏
  • 举报
回复
嗯 语法正确的话,么问题。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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