说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

如何做万能查询

编辑:说三道四文库 发布时间:2017-12-16 05:33
HTML文档下载 WORD文档下载 PDF文档下载
如何做万能查询?
请问各位数据库设计高手的一些数据库查询的设计问题,

一:你们所做的数据库的复杂查询是怎样做的?(能够实现数据的交,并,补等功能)

二:又是如何在英文字段名与中文显示方式之间功换的。(字段少还好解决,但如果字段多到五,六十个那就不可想象)。

三:假如我要做出这样的一种效果:
    Select * from datapb where pbnx ='总库' and (pbzwdm like '%A1' or pbzwdm like '%A2%' or pbzwdm like '%H5%') AND (pbuw not like '%ewc%' or pbuw not like '%ewa%') 
   当然,如果我们是程序设计或数据管理员,这样的问题很好解决,但对一个一点也不懂SQL的用户来说,他们操作的是一些“中文字段名”如,上面的pbzwdm对应于中文名“职位代码”,那么我们是怎样将用户的“代码”翻译成SQL语句来传送给数据库服务器呢?

四:有哪位老兄有这方面的较为理想的 BCB 查询代码。可否奉献出来,认老弟参考参考。
    ib6@163.com
up
拜托,给个招
很感兴趣的问题,高手请了!
写一翻译器
这个问题问得好
我准备写一个这样的类或者组件
确实是很有用的东西
我现在暂时是根据用户输入一个个的判断,然后自己组合合适的sql查询字符串
我有做过,是用ACCESS, 用临时表,效率还不错。(BTW, Access对复杂查询其慢无比)。

不过我的情况都是
Condition1 and Condition2 and Condition3 ...

所以只需取出满足条件一的(到一个临时表), 在从中删除满足条件2的,等等。

这样可以避免SQL 串过长, 而且执行效率相当高。
 
交,并,补?
太复杂。
ALNG不方法对于桌面数据库还可行。
但对于C/S或更复杂的系统则不可取。
还是写翻译器,如当用户在执行查询时用 LIKE ‘%查询内容%’代替“包括”,用"="代替"等于"。用"and"代替“并且",用“not”代替"非"
等等,
好象在用 like "%查询内容%" 代替 "包括" 时有一定的难度,你还的判断用户的 "包括" 后跟随的第几个字符的开始用"%"和什么时候用"%"结尾。谁来做一下?
翻译成SQL根本不是难题, 但是条件太多很容易使SQL过长,即使对于大型数据库复杂的查询也不定快。 如果我做我会一次组织3-5个条件, 分次处理。 
写解释器是必要的
先要确定显示界面,用表格形式吧,这样比较方便又直观
我也在考虑这个这个东东,搞好了给我一个哦txf99@21cn.com
TO:ALNG
我总觉得你上面的方法有些欠妥,还有没有好的方案,最好有实例,
我一时也想不出什么办法了。
123
我到是做过所谓的万能查询,但是这个查询也是有一定的局限性,和数据库的关系太大了。

我觉得关键是如何构建SQL语句,如何将用户的意图转换成为合理的SQL语句。然后再如何将查询到的东西转换成为符合用户的规则的结果,并且将结果显示给用户看。

我写的代码和数据库的关系太大了,一两句话也说不清楚。
come on
Wingsun(孙春阳)
没关系,本来就是做数据库查询,当然关系大了
说说你思路吧!
首先我想明确一下这所谓的万能查询是否是指复合查询?

至于什么翻译器的东西对我来说就太复杂了,
像xxyyzz(做一天和尚撞一天钟)所要实现的效果,用户总不可能是这样写查询条件的吧:“我要查的记录既符合条件1又符合条件2但不符合条件3”?

是不是可以考虑放两个Edit 或什么其它控件来实现这符合和不符合的分类,然后在每个Edit 里用,或;来区分条件有几个。( 这还不太友好,反正就是这个意思:“科技以人为本”,呵~~一定要让用户用起来顺手)再在SQL语句里来添加或删除条件呢?(这首先有了友好的用户界面,对用户来说就没有困难了,剩下的难题就留给开发人员啦~~)

基于web的数据库编程我也不太了解,
但是我手头上刚好有一小段对于几个字段的复合查询的代码,(虽然与你的一个字段下有几个限制的做法不同)我还是决定把它拿出来,看看你合不合用?

 AnsiString sCondition1,sCondition2,sCondition3,sCondition4……
   bool bHasOneCondition=false; //用于指示是否具有一个查询条件,以便决定是否用“and”连接其他条件
   sCondition1=Trim(EditCondition1->Text);//
   sCondition2=Trim(EditCondition2->Text);
   sCondition3=Trim(EditCondition3->Text);
……
  
   Query1->Close();
   Query1->SQL->Clear();
   Query1->SQL->Add("select * from database");
  
 //将条件1作为查询条件(完全匹配)
   if (sCondition1!="")
   {
        if (bHasOneCondition)
            Query1->SQL->Add("and (datafield1=:datafield1)");
        else
        {   Query1->SQL->Add("where (datafield1=:datafield1)");
            bHasOneCondition=true;
        }
        Query1->ParamByName("datafield1")->AsString=sCondition1;
   }
   
 //将条件2作为查询条件(模糊查询)
   if (sCondition2!="")
  {
   if (bHasOneCondition)
            Query1->SQL->Add("and (datafield2 like :datafield2)");
        else
        {   Query1->SQL->Add("where (datafield2 like :datafield2)");
            bHasOneCondition=true;
        }
        Query1->ParamByName("datafield2")->AsString="%"+sCondition2+"%";
   }

//……其它条件依此类推

    Query1->Prepare();
    Query1->Open();
    if (Query1->IsEmpty())
        ShowMessage("没有符合条件的记录,请改变查询条件继续查询");

当然,如果你要把你几十个字段都做一个这样的查询那我觉得太不可思议了,
也想不到有哪一类数据库有这种必要?请赐教。

 
怎么,解决了?

那可要告诉我啊:)
我也正在考虑这样的问题,目前的思路是做导航,多多交流。
flyjac(小牙)的方法按提问者的思路只能实现其中的一种,要么永远是“并且”,要么永远是“或者”,或按逻辑顺序从头到尾一直下去,当操作者想在连续三五个"and"(作为一组)后再连续三五个“or"(作为一组)再再连续三五个“and"(也作为一组,并且其中还含有“not”等)此时你如何是好?就拿其中一个小问题吧,你的"("或")"都无法定位。更别说实现再复杂一点的查询了。
>>wudang(武当闲庭客)
>> 我也正在考虑这样的问题,目前的思路是做导航,多多交流。 
wudang(武当闲庭客)的思路比较接近正轨,但也存在问题,如果用户筛选条件比较多时,用户的条件“就要”筛选完成时,突然发觉条件错了,想修改。回头再来?当然我这种方法比较偏急,
我觉得应该是可以做得出来的,你完全可以根据用户的需要来构建这个SQL语句,如果用户喜欢的话,他可以随意定义这些条件之间的关系,这样用户得到了充分的灵活性,但操作却麻烦了。
请容许我整理以下我的内容,然后再给一个详细的说明。
呵呵,Wingsun(孙春阳) 说的是对的。
重要的是逻辑整合,对用户来说操作可能有点难,然而却是很灵活的,我写过一段程序,(现在没有,我在外面),那时帮别人做的通用查询。有兴趣吗?明天贴上来,不过是Delphi的。
看来我要说两句了,做万能查询不应太过求全,程序员总想把功能做的完美无缺,但有些功能并用户也许一辈子也用不到,我见过别人做的万能查询,功能真的很强,它可以写出这样的表达式:
a and ((b or c) and d)...,但中间的‘(‘很显然无法自动生成,需要用户自己点取左右括号,这样对用户来说不是简化了, 而是复杂化了,更迷惑,实际上用户用得最多的是a and b and c...这样的查询,由于我在开发一个mis系统,为了简化用户查询,自己做了一个通用查询的类来实现,由于涉及公司机密,源码不再公开,我仅讲一下它的实现方法:
一、定义结构
struct Field_Name
{
char fieldName[50];//字段名
char Displayname[50];//显示给用户的名字
int datatype;//字段数据类型
};

这样用户看到的是displayname,而构造sql描述时,使用fieldname


二、程序中对该结构作如下初始化
Field_Name a[n]={{"name","姓名",1},{"sex","性别",1},{"age","年龄",2}...};

char b[m][4]={"<","=",">","<="...}
char c[m][12]={"小于","等于","大于"...}

界面上放两个Combobox,第一个填充a[i].Displayname,第二个填充c[j]
再放一个Edit用与输入条件值,在放一个添加条件的按钮,

这样就可如下处理:
根据第一个COmbobox的index取出a[i].fieldName,在取出b[j],具体实现如下所试,
TStringList *a1,*a2;

ansistring str1,str2;
str1=ansistirng(a[i].fieldname)+AnsiStirng(b[j]);
str2=ansistirng(a[i].diaplay)+AnsiStirng(c[j])+Edit->Text

switch(a[i].datatype)
    {
     switch 1:
         str1+="'"+Edit->text+"'"
         break;
     .....
     }
if(a1->CountNum==0)
    {
    a1->add(str1);
    a2->add(str1)
    }
else
    {
    a1->Add("and "+str1);
    a2->add(" and"+str2);
    }

a2直接送到一个Listbox中显示给用户,
Listbox1->Items=a2;

用TStringList处理的好处时,可以删除中间某条条件,也即用户可以用鼠标点击ListBox选中某条件,并将其删除,a1->delete(n) a2->Delete(n)即可,
当用户完成后,将a1各个条件相加即可
以上的处理过程可做在类中

打字真累,以后再讲吧,我还要休息呢
我的文档带来了,不幸的是我现在的机子上没有word.
有人愿意看一下吗?
如果需要,请留下email,:)
我会发过来
三颗u!  qiangming@263.net
gengxp@elong.com
给我一份,gengxp@elong.com
谢谢,我也想学学
adua@263.net
上面的几位朋友:已发,请查看
上面的几位朋友:已发,请查看
不好意思,你的文档打开为乱码!
WORD2000
已重发,再打不开,可没办法了
打开了告诉我一下
非常感谢!
已能正常打开!
俺你都不发一个?
ib6@163.com
给我一份吧?yu.hermit@sian.com
呵呵,已发
请给我一份三19883010407@sina.com
请给我一份horky@163.net
我也想看看
3hsoft@china.com
me too!
iceblue007@263.net
现在好象大家都在等着要代码。
做复杂查询,随用户要求生成相应SQL语句,我觉得并不难(自大了),关键是做出一界面,来隐藏查询复杂性
将问题再提前一下。
我用ASP和Delphi实现过,没有用C++Builder(当然也不是什么问题^^),就用了一个处理函数很简单,想不想看看??hehe^^ myQQ :3888543
flyjac(小牙) :我现在就在做一个类似的查询,共60个条件!!!用户要求的,我没办法,只好if ..if ....
我有一个万能查询的控件。
万能查询?太难了。程序员应该做出一些常规SQL。对于用户的临时查询,可以考虑教教他们SQL基础知识,由用户自己写吧!
谷歌发布Web延迟基准测试工具 专访JS-Git创始人Tim Caswell:让Git运行于任一平台 一段代码引发的思考 2013年美国开发者薪资调查报告 MDCC之移动娱乐游戏峰会:金玩奖揭晓最火游戏 算法为王:且看Mac Mini如何超越1636节点的Hadoop 鲍尔默成大善人?微软正式废除员工排名评审制度 工信部软件司副司长陈英为MDCC 2013大会致开场辞 全民移动•重塑世界 2013移动开发者大会盛大开幕 泯灭Web App可用性的七个开发错误 保益互动创始人曹军:听到的世界更精彩,盲人应用背后的故事 Gumi公司CEO国光宏尚: 大公开!日本手游市场攻克方法! Great Hill Partners高管Chuck Goldman &amp;amp; 南京创毅CEO William Wei:超越黑莓——下一代企业移动 高通业务拓展副总裁沈劲:智能手机2.0——以体验为中心 百度副总裁李明远:百度轻应用——长尾APP的最佳选择 中国工程院院士李德毅:大数据时代的认知计算 创新工场联合创始人汪华:2013年中国移动互联网进入深入区 百度副总裁李明远:解答关于百度轻应用的八大疑问 谷歌推出PNaCl,帮助开发者在任何硬件和网站上运行代码 阿里云:双十一350亿交易额的幕后英雄 索尼移动智能设备全球技术总监Goran Andersson:索尼移动可穿戴设备解决方案 腾讯社交网络事业部副总裁陈磊:腾讯移动开发者服务体系 基调网络副总裁陈靖华:全面掌握移动应用性能 蓝港在线创始人王峰:手游新时代下的机会与挑战! Couchbase CEO Bob Wiederhold:数据库云端同步,移动应用开发的未来 三星电子大中华区副总裁黄伽卫:构建移动互联生态,解读内容服务新方向 MDCC 2013移动开发者大会:新浪潮,新硬件! 网站建设,如何平衡产品特性和利益需求? 开发者是如何提升技能水平的 Databricks核心成员专访:大数据时代“智能手机”Spark 数据密集、快速启动、核心应用,IBM存储重兵布阵 在线求助ReportBulider如何做这样的报表? 怎样得到用户表名? 大家好帮忙啊 ——————在线等待!! 直接访问操作符"." 和间接访问操作符"->" 有什么区别 数据库优化的问题 一个文本框,有一个验证控件(判断是否为数字),还有一个textchanged事件,这是一个矛盾的东西,让我头疼~~ interface中的uses语句和implemetation中的uses语句有何不同? XP个人单机服务器配置后访问需要帐号密码,怎么办 干得不开心,想转行,大家给点建议 如何实现“让用户自定义快捷键?” 怎么样把.aspx制作成安装的文件?? 我写了如下一个方法,但是用起来有问题,帮我看看!! 俺倒~~~~~~~~`怎么能上三星啊? 向高手求救:如何得到一张表的行数和列数!! 散分!代码解读! 使用sybase时的提示The query and the views in it exceed the limit of 16 tables. 有办法解决吗? 如何将数组的内容添加到一个文件的末尾 怎样才能打开一个489K的.DAT文件? 列表框(ClistCtrl)如何得到选中项的文本内容和选中项的索引值 为什么我登录到Oracle Management Server时老出错。(oracle 9i) 这样的sql语句怎么写呢?急啊!(还可以加分) pb中截取字符串的问题:急,在线等待 急,在VC++.Net中怎样将字符串System::String类型转换为LPSTR类型? 用PQ把NTFS转换成FAT32时,文件名全变名问号了,怎么办?!!!!!!!!!! 又是回车符的问题,急!!!!! 关于工具栏的问题 控件的DragMode为dmAutomatic,不能用鼠标点? 奇怪的电脑时钟 系统不支持本地交互式登陆 ListView的小问题 有责任感的中国人(水均益:我来谈京沪高速铁路 ),顶者有分!200分 如何给MDI窗口设置背景图? 如何使数据按我定义的顺序显示出来 请教,我有一个toolbar,上面有四个toolbutton,问题! 关于按钮的小问题 追加记录思路 TemplatePower控件谁用过,Delphi下做网页报告的,在Builder上装不上 如何在MIDP中保存小数? 关于窗口设计 有责任感的中国人(水均益:我来谈京沪高速铁路 ),顶者有分!200分! 这里没有人关心Yokun吗?还是大家都在闭门造车? XP服务器安装后访问需密码,,该如何设置? 关于dc,hdc,getdc和pchar()的问题 急~~~在线等 上传主页。错误:530 Login incorrect 数据库问题 上傳的問題,急! TemplatePower控件谁用过,Delphi下做网页报告的,在Builder上装不上 怎样在IE打开的时候用JS隐藏IE的工具条 偶MM明天过生日了,我该送点什么她呢? 在线求助ReportBulider这样的报表如何做? 梦到自己的头发找的很长了,这个梦有什么意义吗?前几天刚理发了的,而不久后的夜晚梦到我的头发又长了,要去剪理了,用解梦的语言说一下是什么意思了! 转烛飘蓬一梦归,欲寻陈迹怅人非 请问:转烛飘蓬一梦归,欲寻陈迹怅人非 讲的是什么方面的事情? 粗放型经济增长方式的特征是什么? earlier this month怎么译? 货币流通速度变慢,对增发货币的产出效益有何影响?为什么? 尢 这字怎么读 尢 念什么尢 是"尴尬"两个字的部首 “尢” 同上 纛念什么?用拼音回答 《纛覝》的拼音是什么 鲁迅生于1881年9月25日.(英语) 联合国负责人称叙政府充分合作 销毁化日法庭审判过程遭偷拍 视频上至网络引澳维州建筑工抱怨外国劳工抢饭碗批工会伊朗强硬派质疑伊核谈判中本国代表让步美妇人陪审时哺乳幼儿被法官以藐视法庭伦敦中国城抗议“歧视性”搜捕黑工举行俄车臣地区今年击毙27名武装分子 包美国财政僵局刚解 共和党就医改法案再分析:美国就业数据疲弱 美联储料谨慎德社民党同意正式谈判 协议达成或需4各省区市党委常委班子均已开展批评和自石门坎一工地:建筑垃圾随意堆放食品药品监管总局:“土壤”夏令营孩子很喜欢他和她相遇在开往爱情的公交上门将杯0.8秒之内自动遥测尾气献血伤身?无偿献血者普遍健康美海军迎来首位四星女上将澳门6月博彩收入5年首跌不要低估男人的智商哪里有卖“小儿葫芦散”一品风流星空血源网游之功夫足球我是扶苏魔发飞扬大熊猫无限之重建主神地球竞技场放逐流离仙之武道超级大独裁者屯溪博物馆旅游南湖书院旅游乐叙堂旅游承志堂旅游树人堂旅游南湖旅游莲花亭旅游狮子峰旅游团结松旅游排云亭旅游天海旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘