SQL并列组合查询的另类解决一法

在日常的数据库开发应用中,我们经常会遇到组合查询,最近,阿零在改版洗米器网站的过程中想到了一个另类解决方法,不敢藏私,现把思路发出来和大家共勉。

数据库示例:
比如在一个销售表(item)中部分字段如下:
itemdate(销售日期,短日期型),ltemcount(销售数量,数值型),itemer(业务员),itemarea(客户所在区域),itemstate(单据状态,逻辑型)
我们希望实现如下功能的组合查询:
1、单项目统计:某期间段内的销售统计;销售数量大于(或小于)一个值的统计;某业务员的销售统计;某区域的销售统计;销售单据状态(如:审核或未审核、业务员提成已付或未付、已返利或未返利)。
2、组合查询以上字段的任意组合条件:如某业务员某时间期间尚未提成的销售情况;某业务员在某时间期间销售数量大于某值的销售情况;等等……
界面及简要代码示例:

<input type="checkbox" name="cbstime" />开始日期:<input type="text" style="width:200px" name="starttime" />
<input type="checkbox" name="cbetime" />终止日期:<input type="text" style="width:200px" name="endtime" />
<input type="checkbox" name="cbcount" />销售数量:<select name="yxh" style="width:100px;height:22px;"><option value="=">等于</option><option value=">">大于</option><option value=">=">大于或等于</option><option value="<">小于</option><option value="<=">小于或等于</option></select><input type="text" style="width:100px" name="scount" />
<input type="checkbox" name="cber" />销售人员:<input type="text" style="width:200px" name="ser" />
<input type="checkbox" name="cbarea" />所在区域:<input type="text" style="width:200px" name="sarea" />
<input type="checkbox" name="cbstate" />单据状态:<input type="text" style="width:200px" name="sstate" />

      <input type="button" value="开始查询" />       <input type="button" value="关闭退出" />

开始日期:
终止日期:
销售数量:
销售人员:
所在区域:
单据状态:

              

常规思路与处理方法:
因为示例中的复选框是可以任意组合的,可能一个也没有选中,可能只选中一个,或者选中了第一、第三、第五个,甚至全部选中。那么我们在构造SQL语句的时候就需要判断任何可能的组合,大家都知道,一个也没有选中时的SQL语句是“select * from item”,有一个选中时SQL语句是“select * from item where 条件”,有多个选中是SQL语句是“select * from item where 条件1 and 条件2 and 条件3 ……”,问题的关键在于,你不知道这个示例中的六个条件谁会出现在第一,谁会出现在第二。因此,要在SQL语句中正确插入where和and,你必须罗列任意可能的情况加以判断,如果你的逻辑思维够好,六个复选框的组合查询难不倒你,但是,如果你的逻辑思维不咋地或者是十个甚至二十个复选框呢?想想吧,那是多么让人崩溃的一件事情。
另类处理办法:
其实没有什么技术含量在里边,就是加了几个简单字符而已:“where 1= 1”,很好理解的东西,直接看示例的SQL语句及处理页面的ASP代码:

mysql="select * from item where 1 = 1"

if request.Form("cbstime")="on" then tj1=" and itemdate >= cast('"&request.Form("starttime")&"' as datetime)
if request.Form("cbetime")="on" then tj2=" and itemdate <= cast('"&request.Form("endtime")&"' as datetime)
if request.Form("cbcount")="on" then tj3=" and itemcount "&request.Form("yxh")&" "&request.Form("scount")
if request.Form("cber")="on" then tj4=" and itemer = '"&request.Form("ser")&"'"
if request.Form("cbarea")="on" then tj5=" and itemarea = '"&request.Form("sarea")&"'"
if request.Form("cbstate")="on" then tj6=" and itemstate = "&request.Form("sstate")

mysql=mysql&tj1&tj2&tj3&tj4&tj5&tj6&" order by……"

本文旨在说明组合查询的另类思路,抛砖引玉而已,具体应用中可能还要结合实际(比如,需要判断起始日期输入值是否为日期格式,或者相应地进行转换,开始日期要小于结束日期等等)改动部分代码,在此不做赘述。好了,尽情去发挥你的创意吧。洗米器网站阿零欢迎大家提出不同意见,也很热心和大家共同探讨。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值