SQL如何构建多条件组合查询,而且不降低效率 - chengg0769 来自四川,在东莞虚度十载 - 博客频道 - CSDN.NET chengg0769 来自四川,在东莞虚度十载 PB反编译_Powerbuilder DeCompiler_PB反编译器_PB混淆器_PB加密 目录视图 摘要视图 订阅 新年新气象------CSDN2014新版导航就要跟大家见面了 2014年1月微软MVP当选名单揭晓! “我的2013”年度征文活动火爆进行中! 专访何海涛:“不正经”程序员的进阶之路 SQL如何构建多条件组合查询,而且不降低效率 2007-12-12 14:10 2638人阅读 评论(0) 收藏 举报 sqlpowerbuilderstring数据库数据结构oracle 我们知道,在一般的信息系统中,特别是主要信息表,如客户基本信息,工单受理主界面,用户会用到多条件组合查询。 QQ群请加: 6539042(powerbuilder11&SQL) 我看过一些系统,有的人是采用将一个表的栏位给用户选择,然后用户可以针对某一栏位来下条件,但是这违背多条件组合查询的需求初衷。多条件组合的需求是:用户在不同的视觉情况下,可以使用某个条件或者忽略某个条件,而且前面讲到的基于单表的按字段查询也不适用于复杂的数据结构,比如设计的系统结合的表很多,则将用户限制在单表的多字段是不行的。 我的做法是,作一个通用查询条件窗口出来作为模板,其它界面使用时通过另存或者继承,再修改为符合某个特定界面的条件查询窗。而某些条件如果某窗口用不到,可以让它enabled = false来解决。 我的查询条件公用窗是类似这样的。来自我的[ABCD客服自受理系统]:PB11 构建这个公用窗口的目的在于一劳永逸。但是要注意系统条件,常用的需要全部考虑在上面。 小提示:1. 对于不用的条件,enabled=false这样可以让用户不能填写,不发生杂乱难用的感觉。 2. 对于常用的下拉列表框内容条目,比如上面的工单类型和业务类型,显然不要用"游标"从数据库里去fetch然后添加,因为这样会造成一些挂起,严重时锁表。(我最近看了一套自来水水管理系统,破解后看了看程序的event里很多程序代码,而且内嵌SQL很多。对于dropdownlist这样的填充用的是游标fetch。我分析就是个新手写的程序。客户反映说经常锁表。)其实这个例子应该是用一些办法在程序启动时,将一些FK表检索到本地的全局缓冲里,用的时候直接用,不需要每次都检索。对数据库应用来说,我遵循一个原则:尽量少地读数据库,充分考虑简单高效,并杜绝重复动作。如果你使用pb那就可以将一些表整个检索到datastore里,然后对填充dropdownlist这样的重复劳动,必然要写好全局函数来处理,不需要傻傻地作重复编码工作,或者将下拉框封装成自定义控件,传入dastore,用内部函数完成填充。 注: 如果多选钮勾上,表明这个条件参加SQL查询,否则不参加,那怎么作到呢?技巧就是在SQL的条件里构建用and连接的多组条件,通过逻辑表达式的一个控制参数,如果某个多选框没选择,则直接忽略它。 我的SQL语句是这样的: SELECT serv_100001.docno, serv_100001.docdate, serv_100001.createuser, serv_100001.status FROM serv_100001 WHERE (0 in (:control5) or (1 in (:control5) and serv_100001.status in(20)) or --新录入 (2 in (:control5) and serv_100001.status in(40,60)) or --派单 (3 in (:control5) and serv_100001.status in(80)) or --签收 (4 in (:control5) and serv_100001.status in(90,100,110)) or --继续跟进 (5 in (:control5) and serv_100001.status in(70)) or --处理OK (6 in (:control5) and serv_100001.status in(120,130,140))) and --回复客户结案 (0 = :control6 or (0 = :control6 and serv_100001.callnbr = '')) and (0 = :control7 or (0 = :control7 and serv_100001.duty = 0)) 这是我自己琢磨很久而想到的办法。并且在两套软件中使用。效果还可以。 执行的最后SQL带入条件参数后就是这样的: SELECT serv_100001.docno, serv_100001.docdate, serv_100001.createuser, serv_100001.status FROM serv_100001 WHERE (0 in (1,1,1,1,1,1) or (1 in (1,1,1,1,1,1) and serv_100001.status in(20)) or (2 in (1,1,1,1,1,1) and serv_100001.status in(40,60)) or (3 in (1,1,1,1,1,1) and serv_100001.status in(80)) or (4 in (1,1,1,1,1,1) and serv_100001.status in(90,100,110)) or (5 in (1,1,1,1,1,1) and serv_100001.status in(70)) or (6 in (1,1,1,1,1,1) and serv_100001.status in(120,130,140))) and (0 = 0 or (0 = 1 and serv_100001.callnbr = '')) and (0 = 0 or (0 = 1 and serv_100001.duty = 0)) //20071221修改更清晰一些。 我们很容易看明白。就是其中的controlx起到了很大作用,从而使得构建复杂的成组的条件容易实现,而且不影响到执行效率,因为逻辑关系式遵循短路原则。如果某组条件用户没勾选使用则control1=0就满足,从而不会执行后面的语句,整个分组条件就满足了,所以语句本身不影响速度。 *另外在网上有文章[使用Instr()与decode()进行多条件组合查询]介绍oracle下的函数,其实mssql用substring可以传入一个字符串作为参数,从而解决上面我的代码中的controlx太多的缺点。就是类似于control_string=“YYYYNNYY”,则substring(control_string,1,1)='Y'代表某个条件进行了勾选。当然还有charindex()函数可以用来传条件,比如多个条件传入的参数是:control_string=“A_CD_FGH”则代表A,C,D,F,G,H组的条件被勾选。用charindex('A',control_string)>0则可以判断A组条件被选择了。 *当然,如果你在pb中的话,数据框检索条件里是可以用control[10]这样的数组传入的,则SQL的where条件可以这样写: (1 in (:control_array) and id = :id)。每组条件用不同的编号。比如control_arrar={1,0,0,0,5,9},id=5传入后就是: (1 in (1,0,0,0,5,9) and id = 5),而且用这种方式传递比字符串传入速度更快。 *以上所说方法有一个前提就是控制参数必须在前面。利用逻辑运算的短路原则。用反了可就问题大了。 *另外asp的人说用sql_string="......." + "........."来拼凑代码,也是一个方法。但传递到服务器端的代码跟踪出来,可读性就非常差了。而且把检索看作一个接口的话,这个接口是不固定的,造成代码和数据逻辑的混杂不清。 如果大家有更好的办法,欢迎赐教。 更多 上一篇:自学编程的过程和体会[原创] 下一篇:我的powerbuilder框架,经过三套软件的开发逐渐形成并得到完善 查看评论 * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场 核心技术类目 全部主题 Java VPN Android iOS ERP IE10 Eclipse CRM JavaScript Ubuntu NFC WAP jQuery 数据库 BI HTML5 Spring Apache Hadoop .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP Spark HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap 个人资料 chengg0769 访问:517427次 积分:8562分 排名:第419名 原创:267篇 转载:211篇 译文:0篇 评论:348条 文章搜索 文章分类 PB反编译与加密(12) IOS和安卓(9) PB与数据库(9) 网络相关(1) 搜索相关(0) 闲话扯起耍(1) 其他语言(4) 文章存档 2013年12月(2)2013年11月(2)2013年09月(1)2013年02月(1)2012年11月(1)2012年09月(1)2012年08月(6)2012年07月(1)2012年05月(3)2012年03月(4)2011年12月(2)2011年11月(2)2011年10月(9)2011年09月(6)2011年08月(11)2011年07月(2)2011年06月(4)2011年04月(3)2010年12月(1)2010年10月(2)2010年09月(8)2010年08月(1)2010年07月(8)2010年06月(17)2010年05月(2)2010年04月(2)2010年03月(4)2010年01月(1)2009年09月(8)2009年08月(5)2009年07月(8)2009年06月(8)2009年05月(16)2009年03月(2)2009年02月(7)2008年12月(2)2008年11月(4)2008年10月(5)2008年08月(1)2008年07月(2)2008年01月(12)2007年12月(29)2007年11月(7)2007年10月(4)2007年09月(20)2007年08月(55)2007年07月(176) 阅读排行 搜索引擎学习资源(作者:dongdonglang)(14656) 做代理网站最有效的4种宣传方法(admin9.com)(12036) 再谈powerbuilder程序防止破解的办法(终结篇,以后不再写这个问题)(8098) 程序员的SEO总结(7462) 浅谈Powerbuilder的未来和Powerbuilder使用者的未来(6027) 在一台联想3000G430 T1600笔记本上安装黑苹果(东皇v10.6.3)成功(5958) PowerBuilder DeCompiler(pb decompiler) Demo download(PB反编译,支持5-12)(5926) PB11.5,PB12 web项目初探(5648) 文件夹加密原理 [转](5643) powerbuilder反编译器开发-第一步:pbd结构分析和pbkiller分析(5493) 评论排行 浅谈Powerbuilder的未来和Powerbuilder使用者的未来(49) 程序员的SEO总结(32) 有关Powerbuilder的悲观论和乐观论(由郭贴引发的300多贴争辩想到的,也是很久就想秉明的一个观点)(22) Powerbuilder混淆,加密(powerbuilder防止反编译,pb混淆器,PB加壳,支持5-12) obfuscator for PowerBuilder(20) 戏说DataWindow的“移植”和“临摹”(19) 因为垄断形成,数据库市场将出现更多开源数据库(19) 免费软件模式之随想(18) 软件提交到国外的下载站的几点操作和想法(15) PB11.5,PB12 web项目初探(15) 关于对pbd反编译器的期待(11) 推荐文章 最新评论 安装两个BCB6控件SynEdit、mwEdit 0.92a的过程总结 jiduxiaozhang12345: 请问BCB6的第三方控件在哪下载啊?急求 Powershield一个疑似的BUG zhj149: 高手啊,看你的文章,感觉你玩pb已经到了极致的境界了,我自认为pb还不错,和你比起来,还是差了太多了 软件提交到国外的下载站的几点操作和想法 u012353953: 楼主在吗?有个问题请教,看到请加我QQ,谢谢。17493589 Lucene(Nutch)距离商业文本搜索引擎还有多远?(转载) koubi1986: 你好!请教一些问题:请问一下1。你是如何把nutch抓取到的二进制内容,在项目中读取的。2。nutc... 看一个商业共享软件是如何在下载站刷下载量来作弊的! u011506701: 您的判断是有误的,像我研究的刷量算法你就根本看不出来,出现的曲线图跟正常的一模一样的,附:刷量是最好... 垂直搜索引擎蜘蛛的基本解决方案(编程实例:所以推荐) gis101989: 你好,我正在写面向主题搜索引擎结合地理信息的论文,很多地方不懂,能加个扣扣吗?非常感谢你的帮助,我的... 浅谈Powerbuilder的未来和Powerbuilder使用者的未来 hosthelp: PB的最大缺点就是:(其实很简单)过时了。 服装过时就没人穿了, 电器过时就没人买了, 明星过时(过... 三岁小孩开发搜索引擎,搜索引擎白热化[原创] rongzi1987: 顶一个。先顶再看 再谈powerbuilder程序防止破解的办法(终结篇,以后不再写这个问题) hua2000: 顶顶更健康正在研究反向工程 有个傻B说破解了我的软件—哈哈!黄金屋手机MP3.MP4.3GP.电影.下载系统 ljx811216: 真有这事,看看 我的未来方向 pconline/asp.net周金桥老师的aspnet 友人Blog 旧博客在sina Bluesen的语音卡开发平台 JackXu的开源语音卡框架 经验丰富的好友:杨光的专栏 蓝星际语音平台,Koodoo语言 Lucene改造者-yuetiantian 西部.阿呆's blog manesking:全文检索c/c fullfocus研究lucene,nutch 黄国酬的博客 把“天轰穿”的asp.net 雨松.安卓