【查询】查询好像也可以很简单!

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
简介:      还是要先说一下范围:以数据库为主的程序,b/s结构。        查询嘛,对于我来说就是SQL语句 where 后面(group、order by 前面的)的内容,把这搞定了,查询也就搞定了。

 

     还是要先说一下范围:以数据库为主的程序,b/s结构。

 

     查询嘛,对于我来说就是SQL语句 where 后面(group、order by 前面的)的内容,把这搞定了,查询也就搞定了。

     

     查询的分类,借鉴运算符里的一个术语,我把查询分成了四类:单目查询、双目查询、多目查询、特殊查询。

 

一、单目查询:
1、col = 1;  //数字类型的相等的查询
2、col = 'abc';  //字符串类型的相等的查询
3、col like '%abc%'; //字符串的模糊查询
4、col like 'abc%';
5、col like '%abc';
6、col like 'abc'; //好像没有用

7、col > 10;  //数字类型的大于、小于的查询
8、col < 10;
9、col >= 10;
10、col <= 10;

单目查询基本就是这些了,如果还有其他的,欢迎补充,谢谢。

 

二、双目查询:
1、col between '1900-1-1' and '1901-1-1'; //主要用于时间段的查询。
2、col between 1 and 10;   //数字类型的范围查询。
3、col > 1  and col <=10;   //数字类型的范围查询。
4、col >= 1 and col < 10;   //数字类型的范围查询。
5、col > 1  and col < 10;   //数字类型的范围查询。

单目查询能想到的就是这些了,如果还有其他的,欢迎补充,谢谢。


三、多目查询:

1、col in (1,2,3);    //多条件数字类型的or查询。比如,同时显示研发部和业务部的员工。
2、col in ('1','2','3');   //多条件字符串类型的or查询。

这个呢,表面上看是多目,但是由于一般会采用ChekcBoxList控件,所以呢会直接得到 "1,2,3"这样的值,所以又有点像单目查询,但是处理方式上有些不同。

 

四、特殊查询:
1、col is null;     //查找为null的数据
2、col is not null;    //查找不为null的数据
3、col in (select ID from table1 where ...); //子查询

 

其他,这里呢情况就很多了,对于这种情况就需要使用委托(事件、钩子),交给调用查询控件的部分来处理了。

 

     前三种情况交给查询控件自己处理,第四种情况就要“委托”给别人了,这样即可以保证使用简单,又可以保证灵活性。那么代码怎么实现呢?就是说上面的这些情况怎么抽象出来呢?很简单,利用Dictionary来做。

 

     我们定义一个Dictionary来存放“查询方式”。

 

 

public   static  Dictionary < Int32,  string >  SearchKind  =   new  Dictionary < Int32,  string > ();

 

 

     我们来制定一个编号来作为key值,我们可以规定 1-99表示单目查询;101-199表示双目查询;201-299表示多目查询;301表示特殊查询。然后我们填充Dictionary

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
if (SearchKind.Count == 0)
            {
                
// 字段的查询方式。1:= int;2:=string; 3:like %n%;  4:like n%; 5:like %n ;6:like n;11:> string;12:< string;13:>= string;14: <= string

                
//加载查询方式
                
//单目查询
                SearchKind.Add(1"[{0}]={1}"); //1:= int;
                SearchKind.Add(2"[{0}]='{1}'"); //2:=string

                SearchKind.Add(
3"[{0}] like '%{1}%'"); //3:like %n%;
                SearchKind.Add(4"[{0}] like '{1}%'"); //4:like n%;
                SearchKind.Add(5"[{0}] like '%{1}'"); //5:like %n ;
                SearchKind.Add(6"[{0}] like '{1}'"); //6:like n;

                SearchKind.Add(
11"[{0}] > {1}"); //11:> string;
                SearchKind.Add(12"[{0}] < {1}"); //12:< string;
                SearchKind.Add(13"[{0}] >= {1}"); //13:>= string;
                SearchKind.Add(14"[{0}] <= {1}"); //14: <= string

                
//双目查询
                SearchKind.Add(101"[{0}] between '{1}' and '{2}'"); //21      'between string
                SearchKind.Add(102"[{0}] between  {1}  and {2}  "); //22      'between int
                SearchKind.Add(103"[{0}] > {1}  and [{0}] <={2}"); //22      'between int
                SearchKind.Add(104"[{0}] >= {1} and [{0}] < {2}"); //22      'between int
                SearchKind.Add(105"[{0}] > {1}  and [{0}] < {2}"); //22      'between int
                
                
//多目查询
                SearchKind.Add(201"[{0}] in ({1})"); //23     'col in () 多选查询 数字方式
                SearchKind.Add(202"[{0}] in ('{1}')"); //24   'col in () 多选查询 字符串方式

                
//特殊查询
                SearchKind.Add(301""); //30     '不生成查询条件


            }

 

     看到这里您可能已经想到了,下一步我们只要做一个替换就可以了。
          {0}替换成字段名称,

          {1}替换成第一个关键字,

          {2}替换成第二个关键字就可以了.

     

     当然有些地方还需要做一点点处理。用Dictionary的目的就是可以方便的扩展查询方式。假设原来没有 col > 1  and col <=10; 这种查询方式,那么只要add一个就可以了。

 

     好了查询方式、查询规则已经设定好了,那么字段名和字段值怎么获取呢?

 

     我们在做表单控件的时候已经完成了这几个步骤,表单控件可以自动绘制UI,拥有字段名称,提取用户输入的信息,那么查询控件就可以利用这些现有的功能,看下图。

     

     我们在设计表单控件的的时候,就已经预留出来了,把这些公用的功能都放在了 BaseForm 里面,查询控件只需要继承这个类就可以拥有字段名和字段值,还有绘制UI的功能了。

 

     字段名称和字段值保存在BaseColumnsInfo类里面,在查询控件里面直接使用就可以了,BaseColumnsInfo里面还有一个查询方式的属性,就是上面定义的编号。

 

     然后我们根据查询方式来替换一下就可以了。

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
 public string GetSearchWhere()
        {
            System.Text.StringBuilder sql 
= new StringBuilder(1000);
            sql.Append(
" 1=1 ");

            
//提取用户输入的信息
            GetInputValue();

             BaseColumnsInfo bInfo;
                   
            
foreach (KeyValuePair<int, BaseColumnsInfo> info in dic_BaseCols)
            {
                
//根据查询条件,拼接SQL语句。
                bInfo = (BaseColumnsInfo)info.Value;

                
if (bInfo.DataValue.Length > 0 && bInfo.DataValue != "-3")
                {
                    sql.Append(
" and ");

                    
if (bInfo.FindKind < 100)
                    {
                        
//单目查询
                        sql.Append(String.Format(SearchKind[bInfo.FindKind], bInfo.ColSysName, bInfo.DataValue));

                    }

                    
else if (bInfo.FindKind < 200)
                    {
                        
//双目查询
                        string[] str = bInfo.DataValue.Split('`');
                        
if (str.Length >= 2)
                            sql.Append(String.Format(SearchKind[bInfo.FindKind], bInfo.ColSysName, str[
0], str[1]));

                    }

                    
else if (bInfo.FindKind < 300)
                    {
                        
//多目查询
                        string query2 = bInfo.DataValue;
                        
if (bInfo.FindKind == 302)
                            query2 
= query2.Replace(",""','");

                        sql.Append(String.Format(SearchKind[bInfo.FindKind], bInfo.ColSysName , query2));
                    }

                    
//特殊查询不处理
                                     
                }
            }

            
return sql.ToString();

        }

 

      我没有使用实体类,所以也不知道使用实体类的方式如何来实现查询,所以呢,目前只是针对SQL语句来做查询功能,得到了SQL语句(where后面的),也就达到了我的目的。

 

     说了这么多,好像有点晕,我想让查询控件做下面几件事情:

 

1、绘制UI,就是自动添加文本框的控件。

2、布局,多行多列的方式显示。

3、提取用户输入的数据。

4、根据查询方式拼接成SQL语句。

 

其中前三条和表单控件一样,所以就抽出来一个基类BaseForm,在BaseForm里面实现,查询控件只实现第四条就可以了。

 

源代码下载,代码还比较粗糙,没有整理,还有一些不合理的地方。我想先把搭架子搭建起来,然后在完善细节。

http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html

 

    

 
相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
8天前
|
NoSQL MongoDB 数据库
查询数据
查询数据
11 4
|
2月前
|
SQL 存储
6. 复杂查询
6. 复杂查询
|
2月前
|
算法 Oracle 关系型数据库
数据库等值查询与统计信息
简介: 统计信息是为优化器的 cost 估算提供数据支撑,其中很重要的一点需求便是等值查询(EQUALS, IN 等) 场景下的基数估算。
数据库等值查询与统计信息
|
缓存 自然语言处理 网络架构
Elasticearch 查询详解 (二)
elk官网: [https://www.elastic.co/guide/en/enterprise-search-clients/index.html](https://www.elastic.co/guide/en/enterprise-search-clients/index.html) 作者主页:https://www.couragesteak.com/
Elasticearch 查询详解 (二)
|
C++
202009-1称检测点查询
202009-1称检测点查询
66 0
202009-1称检测点查询
小技巧 - 如何查询医保卡号?
小技巧 - 如何查询医保卡号?
1345 0
小技巧 - 如何查询医保卡号?
|
SQL 关系型数据库 MySQL
五、简单查询
五、简单查询
128 0
|
关系型数据库 MySQL 数据库
Mysql查询-表数据的查询
创建一个数据库 create database python_test charset=utf8; 使用一个数据库 use python_test; 显示使用的当前数据是那个? select database(); 创建一个数据表 create table students( id int unsigned not null auto_increment primary key, name varchar(30), age tinyint unsigned default 0, high decimal(5
172 0
|
JavaScript 索引
查询
find简介 MonngoDB中使用find来进行查询。查询就是返回集合文档中的子集,子集的范围从0个到文档到整个集合。find的第一个参数决定了要返回哪些文档,这个参数是一个文档,用于指定的查询条件。
859 0

热门文章

最新文章