困住了的一道T-SQL 语句,欢迎各界高手来飘过留答!
create proc Orders
@ship varchar(100),
@company varchar(100),
@trade varchar(100),
@starttime datetime ,
@endtime datetime
as
(???????)
go
(这个表的查询是:select * from All_Orders)
@ship 、 @company 、@trade 、 @starttime 、 @endtime
这五个变量是传递过来的 查询条件
5个查询条件 是交互的, 也就是说 不知道用户传递过来的是哪个条件,
怎么来进行查询呢?
请求 各路漂浮的同事们~
[最优解释]
试试:
if @starttime is null
select * from All_orders where ship=isnull(@ship,ship)
and company=isnull(@company,company) and trade=isnull(@trade,trade)
if @starttime is null
select * from All_orders where ship=isnull(@ship,ship)
and company=isnull(@company,company) and trade=isnull(@trade,trade) and orders_datetime
between @starttime and @endtime
看上去没啥问题啊
[其他解释]
create proc Orders
@ship varchar(100)=null,
@company varchar(100)=null,
@trade varchar(100)=null,
@starttime datetime =null,
@endtime datetime=null
as
select * from All_Orders where ship=isnull(@ship,ship) and company=isnull(@company,company) and trade=isnull(@trade,trade) and starttime=isnull( @starttime,starttime)and endtime=isnull( @endtime ,endtime)
go
[其他解释]
以前经常有if判断然后动态拼接的。
现在发哥这种就可以了,用isnull判断一下,为null的就不用处理了。
当然这样的话,如果没有传这个条件,而数据中又是null值的数据是取不出来的。
[其他解释]
这里面的@starttime 、@endtime 应该是 orders_datetime between @starttime and @endtime
查询两个时间段时间的数据
请问 应该怎么来写呢?
[其他解释]
就性能来说,用if拼接后用 sp_executesql 将可重用计划缓冲,而且计划的选择也较好
[其他解释]
我的写法有一定的限制,但是想了一下那5个if/else有点变态......而且这个也是我以前做开发时候用过的,当然记住,有适用场合,不是说通用。
[其他解释]
现在还用不?
[其他解释]
现在不做开发了。。。。
------其他解决方案--------------------
这种如果要用if拼接的话 是15个if。。。。不是5个。这是个交互查询方式。
发哥 请解答一下刚才的问题~~
这里面的@starttime 、@endtime 应该是 orders_datetime between @starttime and @endtime
查询两个时间段时间的数据
[其他解释]
那要先知道你的业务,如果不传你默认如何解决?我假设一下,如果都不穿,那么默认starttime为1900-01-01,endtime为表里最大的orders_datetime,如果这样的话,那isnull(starttime,'1900-01-01') and isnull(@endtime,@maxtime)
这里@maxtime是内部变量,定义以后获取表中最大的orders_datetime
仅供参考
[其他解释]
发哥 您说的 我试验了一下 我明白了。 以后做别的开发肯定用的上,我学习了。在这里谢谢了~发哥~
但是 我这里面的业务要求是这样的。
@ship varchar(100),
@company varchar(100),
@trade varchar(100),
@starttime datetime ,(如果@starttime有传入的话,@endtime 肯定也会有传入。因为这是两个时间段传入的参数 用sql里的between )
相当于需要有4个查询条件,而且这4个查询条件是任意交互的,不能确定哪一个为空,有可能是ship 和company ,也有可能是ship 和 company 和 starttime 等等方式,所以上面我说如果用if来拼接的话 是15个if。
如果是这种情况 必须要用15个if连接吗? ~ 苦恼了很长时间。虽然我现在用的是15个连接拼法,但是保不准以后用5个条件 甚至更多,如果用if连接的话 那可就连多啦发哥。。求助啊
[其他解释]
那你其实可以仅仅考虑是否有日期,这样只需要一次if/else
[其他解释]
哦?
if @starttime =''
select * from All_orders where ship=isnull(@ship,ship)
and company=isnull(@company,company) and trade=isnull(@trade,trade)
if @starttime !=''
select * from All_orders where ship=isnull(@ship,ship)
and company=isnull(@company,company) and trade=isnull(@trade,trade) and orders_datetime
between @starttime and @endtime
这样嘛
[其他解释]
这样达不到那种要求啊。执行结果和15个if 拼接 出来的结果不一样。
[其他解释]
可算是弄出来 ,是以前的一个同学给我方法(ship=@ship or @ship is null or @ship ='')
这种方法。。非常感谢发哥的思路~~~~ 结贴~