有没有可能把Case when 语句当作where的条件表达式?

7030 2012-07-16 04:49:18
如表
Field1 Field2
A '2012-1-1'
B '2012-2-1'
C '2012-3-1'
D '2012-4-1'
想要的结果是
select * from [table] where case when Field='a' then Field2>'2012-2-1' when Field1='c' then Fied3 between '2012-1-1' and '2012-5-1' else Field2>'2012-1-1' end
返回
B '2012-2-1'
C '2012-3-1'
D '2012-4-1'

或者有变通的办法也行
...全文
1634 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2012-07-17
  • 打赏
  • 举报
回复
http://blog.csdn.net/dba_huangzj/article/details/7684520看看我翻译的,说不定有帮助
quchen520 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

2和4楼的代码是能解决问题,我想提高的是速度和较少的代码,如果有10个字段,每种字段又有2种情况,那用or连接效率太低,用union可是要写2^10的sql语句了
[/Quote]
77你注意了么?
where Field='a' and Field2>'2012-2-1'
where Field2>'2012-1-1'
这两条件根本就是冲突的啊,有了第二个条件,第一个条件搜索出的结果肯定是被包含在内的啊
所以我才说楼主的题目是不是有问题
luckings 2012-07-16
  • 打赏
  • 举报
回复

select * from [table] where Field='a' and Field2>'2012-2-1'
union all
select * from [table] where Field1='c' and Fied3 between '2012-1-1' and '2012-5-1'
union all
select * from [table] where Field2>'2012-1-1' and Field!='a' and Field!='c'
SQL77 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
2和4楼的代码是能解决问题,我想提高的是速度和较少的代码,如果有10个字段,每种字段又有2种情况,那用or连接效率太低,用union可是要写2^10的sql语句了
[/Quote]
楼主的想法是可以.那你自己知道用OR不好.就别怕代码短.
7030 2012-07-16
  • 打赏
  • 举报
回复
2和4楼的代码是能解决问题,我想提高的是速度和较少的代码,如果有10个字段,每种字段又有2种情况,那用or连接效率太低,用union可是要写2^10的sql语句了
Felixzhaowenzhong 2012-07-16
  • 打赏
  • 举报
回复
case when  可以用在 SELECT 、WHERE  、ORDER BY  后面
quchen520 2012-07-16
  • 打赏
  • 举报
回复
怎么看都觉得楼主的题目有问题,请在说清楚些

如果2,4楼的代码可得到你想要的结果那就不用解释了。
叶子 2012-07-16
  • 打赏
  • 举报
回复
如果业务比较复杂,那么处理起来也就会相对复杂。
7030 2012-07-16
  • 打赏
  • 举报
回复
非常感谢各位的回答,如果条件表达式不复杂是能实现,
问题是多字段多种组合,如果用or处理的话速度会慢,用union那要写一大堆代码...
--小F-- 2012-07-16
  • 打赏
  • 举报
回复
select * from [table] where Field='a' and Field2>'2012-2-1'
union all
select * from [table] where Field1='c' and Fied3 between '2012-1-1' and '2012-5-1'
union all
select * from [table] where Field2>'2012-1-1'
孤独加百列 2012-07-16
  • 打赏
  • 举报
回复

IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'tba')
BEGIN
DROP TABLE tba
END
GO
CREATE TABLE tba
(
Field1 VARCHAR(10),
Field2 VARCHAR(10)
)
GO
INSERT INTO tba
SELECT 'A', '2012-01-01' UNION
SELECT 'B', '2012-02-01' UNION
SELECT 'C', '2012-03-01' UNION
SELECT 'D', '2012-04-01'
GO


select * from tba
where Field2 BETWEEN CASE when Field1 ='A' then '2012-02-01'
else '2012-01-01' end AND CASE WHEN Field1 = 'C' THEN '2012-05-01'
ELSE Field2 END
/*
Field1 Field2
B 2012-02-01
C 2012-03-01
D 2012-04-01
*/
叶子 2012-07-16
  • 打赏
  • 举报
回复
where 
(Field='a' and Field2>'2012-2-1')
or
(Field1='c' and Fied3 between '2012-1-1' and '2012-5-1')
or
(Field2>'2012-1-1')
xuam 2012-07-16
  • 打赏
  • 举报
回复
可以.

34,588

社区成员

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

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