• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

求多条件SQL语句

hnymx2005 2008-03-28 10:54:53
有下表:如何取得状态为已签1或交款日期在08年3月份,同时分公司为江苏的客户,结果应为李1、李5、李7、李8、李10
客户姓名   分公司    状态 交款日期
李1    江苏  已签1 08-3-1
李2 山东    已签2  08-4-6
李3     江苏    已签2 08-2-18
李4     安徽    已签1  08-1-6
李5 江苏    已签2  08-3-10
李6 山东    已签1  08-2-19
李7 江苏    已签2 08-3-15
李8 江苏    已签1 08-3-11
李9     江苏    已签2  08-2-1
李10 江苏    已签1 08-3-5
...全文
90 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Limpire 2008-03-29
如果“交款日期”有索引,1楼的可以利用索引,conver转换之后不能利用索引。

即使没有索引,convert仍然是要耗时的,1楼仅仅是将2008-3-1和2008-4-1两个字串值隐式转换为datetime,当然效率更高。

回复
Aslan_ 2008-03-29
[Quote=引用 4 楼 Limpire 的回复:]
当然是你的高
[/Quote]
方便解析一下吗?
回复
gggg007 2008-03-29
select * from tmp where (状态='已签1' or month(交款日期)=3) and 分公司='江苏'
回复
Limpire 2008-03-28
当然是你的高
回复
hui_hui_2007 2008-03-28
convert(varchar(6),交款日期,112)='200803'

交款日期 >= '2008-3-1' and 交款日期 < '2008-4-1')

这两种方式哪种效率高呢?

回复
Limpire 2008-03-28
--> 测试数据: #T
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (客户姓名 varchar(4),分公司 varchar(4),状态 varchar(5),交款日期 datetime)
insert into #T
select '李1','江苏','已签1','08-3-1' union all
select '李2','山东','已签2','08-4-6' union all
select '李3','江苏','已签2','08-2-18' union all
select '李4','安徽','已签1','08-1-6' union all
select '李5','江苏','已签2','08-3-10' union all
select '李6','山东','已签1','08-2-19' union all
select '李7','江苏','已签2','08-3-15' union all
select '李8','江苏','已签1','08-3-11' union all
select '李9','江苏','已签2','08-2-1' union all
select '李10','江苏','已签1','08-3-5'

select * from #T where (状态='已签1' or convert(varchar(6),交款日期,112)=200803) and 分公司='江苏'

/*
客户姓名 分公司 状态 交款日期
---- ---- ----- -----------------------
李1 江苏 已签1 2008-03-01 00:00:00.000
李5 江苏 已签2 2008-03-10 00:00:00.000
李7 江苏 已签2 2008-03-15 00:00:00.000
李8 江苏 已签1 2008-03-11 00:00:00.000
李10 江苏 已签1 2008-03-05 00:00:00.000
*/
回复
hui_hui_2007 2008-03-28

create table tmp (
客户姓名 varchar(5),
分公司 varchar(6),
状态 varchar(6),
交款日期 datetime
)

insert into tmp
select '李1','江苏','已签1','08-3-1' union all
select '李2','山东','已签2','08-4-6' union all
select '李3','江苏','已签2','08-2-18' union all
select '李4','安徽','已签1','08-1-6' union all
select '李5','江苏','已签2','08-3-10' union all
select '李6','山东','已签1','08-2-19' union all
select '李7','江苏','已签2','08-3-15' union all
select '李8','江苏','已签1','08-3-11' union all
select '李9','江苏','已签2','08-2-1' union all
select '李10','江苏','已签1','08-3-5'

select *
from tmp
where 分公司='江苏' and (状态='已签1' or (交款日期 >= '2008-3-1' and 交款日期 < '2008-4-1'))

/*
客户姓名 分公司 状态 交款日期
----- ------ ------ ------------------------------------------------------
李1 江苏 已签1 2008-03-01 00:00:00.000
李5 江苏 已签2 2008-03-10 00:00:00.000
李7 江苏 已签2 2008-03-15 00:00:00.000
李8 江苏 已签1 2008-03-11 00:00:00.000
李10 江苏 已签1 2008-03-05 00:00:00.000

(所影响的行数为 5 行)
*/
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-03-28 10:54
社区公告
暂无公告