发明内容
本申请实施例提供一种数据查询方法、装置、电子设备及存储介质,无需开发和维护复杂的数据可持续更新算法策略,降低了数据查询的实现复杂度,且不需要在本地存储视图表中的数据,节省了存储资源。
一方面,本申请一实施例提供了一种数据查询方法,包括:
获取用于指示从视图表中查询指定数据的第一查询语句,所述视图表是基于原始查询语句生成的,所述原始查询语句用于指示从指定数据库中查询数据;
基于所述原始查询语句,修改所述第一查询语句,获得用于指示从所述指定数据库中查询所述指定数据的第二查询语句;
基于所述第二查询语句,获得所述指定数据。
一方面,本申请一实施例提供了一种数据查询装置,包括:
获取模块,用于获取用于指示从视图表中查询指定数据的第一查询语句,所述视图表是基于原始查询语句生成的,所述原始查询语句用于指示从指定数据库中查询数据;
修改模块,用于基于所述原始查询语句,修改所述第一查询语句,获得用于指示从所述指定数据库中查询所述指定数据的第二查询语句;
查询模块,用于基于所述第二查询语句,获得所述指定数据。
可选地,所述修改模块,具体用于:
根据从所述原始查询语句中获得的表征原始字段和别名字段之间的对应关系,将所述第一查询语句中的别名字段替换为对应的原始字段;
将所述第一查询语句中的视图表替换为所述指定数据库;以及
将所述原始查询语句中的查询条件添加到所述第一查询语句的条件子句中。
可选地,所述装置还包括解析模块,用于通过以下方法获取所述对应关系:
基于查询字段分割符,将所述查询字段子句切分为多个查询字段;
针对包含别名定义字符的任一查询字段,从所述任一查询字段中获取具有对应关系的原始字段和别名字段,其中,所述别名定义字符为用于定义原始字段和别名字段之间具有对应关系的字符。
可选地,所述解析模块,具体用于:
若所述任一查询字段中包含的别名定义字符为AS,则将所述任一查询字段中AS之前的字段确定为原始字段,将所述任一查询字段中AS之后的字段确定为所述原始字段对应的别名字段;
若所述任一查询字段中包含的别名定义字符为CASE,则将所述任一查询字段中CASE和END之间的字段确定为原始字段,将所述任一查询字段中END之后的字段确定为所述原始字段对应的别名字段;
若所述任一查询字段不包含AS和CASE,且所述任一查询字段中包含空格符,则将所述任一查询字段中空格符之前的字段确定为原始字段,将所述任一查询字段中空格符之后的字段确定为所述原始字段对应的别名字段。
可选地,所述解析模块,具体用于:
将所述查询字段子句中括号内的与查询字段分隔符相同的符号,替换为预设的特殊字符;
基于所述查询字段分割符,将替换符号后的查询字段切分为多个查询字段;
将所述多个查询字段中的特殊字符替换为所述查询字段分割符。
可选地,所述装置还包括标记模块,用于:
若别名字段对应的原始字段已使用聚合函数,则将所述别名字段标记为不能使用聚合函数的字段;
当对标记为不能使用聚合函数的字段使用聚合函数时,输出不能使用聚合函数的提示信息。
可选地,所述修改模块,具体用于:在所述第一查询语句的条件子句中的查询条件之前,添加所述原始查询语句中的查询条件。
可选地,当所述原始查询语句的条件子句中包含自定义条件对应的占位符时,所述修改模块,还用于若确定所述第一查询语句中包含自定义查询条件,则删除所述第一查询语句中的自定义查询条件,并将添加到所述第一查询语句中的占位符替换为所述自定义查询条件。
一方面,本申请一实施例提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,处理器执行计算机程序时实现上述任一种方法的步骤。
一方面,本申请一实施例提供了一种计算机可读存储介质,其上存储有计算机程序指令,该计算机程序指令被处理器执行时实现上述任一种方法的步骤。
一方面,本申请一实施例提供了一种计算机程序产品,所述计算机程序产品包括存储在计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,所述程序指令被处理器执行时实现上述任一种方法的步骤。
本申请实施例提供的数据查询方法、装置、电子设备及存储介质,在基于视图表进行数据处理时,基于视图表对应的原始查询语句,修改针对视图表的第一查询语句,获得可直接从原始查询语句的指定数据库中查询数据的第二查询语句,基于第二查询语句直接从指定数据库中获取数据,因此,不需要在本地存储视图表中的数据,也就不需要将指定数据库中变化的数据更新到视图表中,也就无需开发和维护复杂的数据可持续更新算法策略,还可以节省大量的本地存储资源,降低了数据分析客户端和服务器的复杂度,且可移植性强。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。
为了方便理解,下面对本申请实施例中涉及的名词进行解释:
云技术(Cloud technology)是指在广域网或局域网内将硬件、软件、网络等系列资源统一起来,实现数据的计算、储存、处理和共享的一种托管技术。云技术是基于云计算商业模式应用的网络技术、信息技术、整合技术、管理平台技术、应用技术等的总称,可以组成资源池,按需所用,灵活便利。云计算技术将变成重要支撑。技术网络系统的后台服务需要大量的计算、存储资源,如视频网站、图片类网站和更多的门户网站。伴随着互联网行业的高度发展和应用,将来每个物品都有可能存在自己的识别标志,都需要传输到后台系统进行逻辑处理,不同程度级别的数据将会分开处理,各类行业数据皆需要强大的系统后盾支撑,只能通过云计算来实现。
数据库(Database),简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML(Extensible MarkupLanguage,即可扩展标记语言);或依据所支持的计算机类型来作分类,例如服务器群集、移动电话;或依据所用查询语言来作分类,例如SQL(结构化查询语言(Structured QueryLanguage)、XQuery;或依据性能冲量重点来作分类,例如最大规模、最高运行速度;亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支持多种查询语言。
SQL(Structured Query Language,结构化查询语言)是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。常见的SQL语句包括mysql、postgresql、oracle、sqlserver等。
查询语句:SQL语句中的数据查询语句,其核心指令为SELECT,为了进行精细的查询,加入了各类辅助指令,包括FROM、WHERE、GROUP BY和ORDER BY等。
字段:把表中的每一行叫做一个“记录”,每一个记录包含这行中的所有信息,就像在通讯录数据库中某个人全部的信息,但记录在数据库中并没有专门的记录名,常常用它所在的行数表示这是第几个记录。字段是比记录更小的单位,字段集合组成记录,每个字段描述文献的某一特征,即数据项,并有唯一的供计算机识别的字段标识符。
别名:显示查询结果时,数据库会显示每个SELECT后面指定的输出列,在有些情况下,显示的列的名称会很长或者名称不够直观,这时可以指定列别名。
正则表达式:又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
视图(view):是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
客户端(Client)或称为用户端,是指与服务器相对应,为客户提供本地服务的程序。除了一些只在本地运行的应用程序之外,一般安装在普通的客户机上,需要与服务端互相配合运行。因特网发展以后,较常用的用户端包括了如万维网使用的网页浏览器,收寄电子邮件时的电子邮件客户端,以及即时通讯的客户端软件等。对于这一类应用程序,需要网络中有相应的服务器和服务程序来提供相应的服务,如数据库服务,电子邮件服务等等,这样在客户机和服务器端,需要建立特定的通信连接,来保证应用程序的正常运行。
附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。
在具体实践过程中,经常会将基于用户输入的SQL查询到的数据作为可视化报表的数据源,并生成视图表存储在本地,这样用户就可以使用新的SQL语句直接从本地存储的视图表中查询数据,实现对视图表中数据的二次处理,如进行查询、筛选、分组、排序等操作,获得更优质的数据分析结果。但是,一旦原数据库中的数据发生变化,就需要同步更新视图表中的数据,因此,从本地存储的视图表中查询数据的方案,需要做数据可持续更新的相关算法策略,实现起来较为复杂,且本地存储需要耗费大量的存储资源,这些都导致项目臃肿、可移植性较差。
为此,本申请提供了一种数据查询方法,基于用户输入的原始查询语句生成相应的视图表;当用户需要对视图表中的数据进行查询、筛选、分组、排序等操作时,可输入用于指示从视图表中查询指定数据的第一查询语句,基于原始查询语句修改该第一查询语句,获得用于指示从指定数据库中查询指定数据的第二查询语句,即将本次查询的数据源修改为原始查询语句中的指定数据库,进而直接从指定数据库中查询数据。由于上述数据查询方法,在基于视图表进行数据处理时,可直接从指定数据库中查询数据,因此,不需要同步更新原数据库和视图表中的数据,也就无需开发和维护复杂的数据可持续更新算法策略,且不需要在本地存储视图表中的数据,节省了存储资源。基于上述数据查询方法实现的数据查询系统,实现复杂度低、可移植性强。
在介绍完本申请实施例的设计思想之后,下面对本申请实施例的技术方案能够适用的应用场景做一些简单介绍,需要说明的是,以下介绍的应用场景仅用于说明本申请实施例而非限定。在具体实施时,可以根据实际需要灵活地应用本申请实施例提供的技术方案。
参考图1,其为本申请实施例提供的数据查询方法的应用场景示意图。该应用场景包括终端设备101、服务器102和多个数据库103。其中,终端设备101和服务器102、服务器102和各个数据库103之间均可以通过无线或有线网络连接,终端设备101包括但不限于智能手机、笔记本电脑、台式计算机、平板电脑、媒体播放器、智能可穿戴设备、智能音箱、智能电视等电子设备。服务器102和数据库103均可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN、以及大数据和人工智能平台等基础云计算服务的云服务器。
终端设备101中安装有数据分析客户端,用户可通过数据分析客户端,编辑自定义的查询语句,该查询语句中可包括查询字段、数据库、查询条件等,将编辑好的查询语句发送给服务器102,服务器102基于查询语句,从相应的数据库103中获取与查询字段相关的、且满足查询条件的数据,将查询到的数据返回给终端设备101,终端设备101内的数据分析客户端按照一定的方式展示查询到的数据。用户还可以通过数据分析客户端,基于已查询到的数据进行二次查询,或者对已查询到的数据进行筛选、分组、排序等,获得更有针对性、更精细化的数据分析结果。
用户也可以通过终端设备101登录数据分析网站,通过网页获取数据分析服务,网页端的具体实现方式与数据分析客户端类似,不再赘述。
当然,本申请实施例提供的方法并不限用于图1所示的应用场景中,还可以用于其它可能的应用场景,本申请实施例并不进行限制。对于图1所示的应用场景的各个设备所能实现的功能将在后续的方法实施例中一并进行描述,在此先不过多赘述。
为进一步说明本申请实施例提供的技术方案,下面结合附图以及具体实施方式对此进行详细的说明。虽然本申请实施例提供了如下述实施例或附图所示的方法操作步骤,但基于常规或者无需创造性的劳动在所述方法中可以包括更多或者更少的操作步骤。在逻辑上不存在必要因果关系的步骤中,这些步骤的执行顺序不限于本申请实施例提供的执行顺序。
本申请实施例的数据查询方法,可应用于终端设备中的数据分析客户端,也可以应用于网页端。下面结合图1所示的应用场景,以应用于数据分析客户端为例,对本申请实施例提供的技术方案进行说明。
参考图2,本申请实施例提供一种数据查询方法,具体包括以下步骤:
S201、获取用于指示从视图表中查询指定数据的第一查询语句,该视图表是基于原始查询语句生成的,该原始查询语句用于指示从指定数据库中查询数据。
本申请实施例中的查询语句包括SELECT子句(即查询字段子句)、FROM子句(即数据源子句)、WHERE子句(即条件子句)、GROUP BY子句以及ORDER BY子句等。本申请实施例中主要涉及查询字段子句、数据源子句和条件子句,查询字段子句即查询语句中的关键词SELECT和FROM之间的字符串,数据源子句即管关键词FROM和WHERE之间的字符串,条件子句即关键词WHER之后的字符串。查询字段子句中包括至少一个查询字段,数据源子句中包括查询数据时使用的数据库,条件子句中包含至少一个查询条件,服务器收到数据分析客户端发送的查询语句后,从数据源子句中的指定数据库中,查询到查询字段对应的数据,并基于查询条件对已查询的数据进行筛选,将满足查询条件的数据返回给数据分析客户端。当然,用户也可以不设置查询条件,此时,服务器直接将查询字段对应的数据返回给数据分析客户端。
以下为查询语句的一个示例:
在一些情况下,数据表中显示的数据的字段名很长或者不够直观,为了使得数据表更加简洁、可读性更强,可以为字段名设置对应的别名字段,在数据表中显示别名字段,将别名字段对应的字段名称为原始字段,例如,原始字段为date_format(create_time,'%Y-%m-%d'),可设置对应的别名字段为create_date。因此,查询字段子句中的这些查询字段可分为两类,一类包含原始字段和别名字段,如“date_format(create_time,'%Y-%m-%d')AS create_date”中的原始字段是date_format(create_time,'%Y-%m-%d'),别名字段为create_date,在数据表中显示的是别名字段为create_date;另一类是未设置别名的查询字段,即只包含原始字段,如上述查询语句示例中的api_name、page_id等,在数据表中直接显示原始字段。
具体实施时,在执行步骤S201之前,用户可打开数据分析客户端,进入数据表管理页面,数据表管理页面的界面示意图可参考图3A,点击数据表管理页面30中的新建数据表按钮301,显示如图3B所示的新建数据表页面302。用户在SQL语句栏中输入原始查询语句,点击解析按钮303后,数据分析客户端会从原始查询语句中解析出SELECT子句中的别名字段和不包含别名字段的原始字段,用户可勾选后续处理时需要用到的字段或者选择全选。此外,还可以选择查看每个解析出的字段的详情信息,并设置对应的中文名、字段类型、备注、格式等信息,对于设置中文名的字段,在后续处理过程中显示对应的中文名,以方便用户操作,并提高生成的数据表的可读性。用户确定解析出的字段无误,并设置好各个字段对应的详情信息后,点击确定按钮304,触发数据分析客户端为原始查询语句新建一个视图表,并关联存储原始查询语句、解析获得的字段、字段对应的中文名称、原始字段和别名字段的对应关系等信息。参考图3B,用户还可以在新建数据表页面中设置视图表对应的文件夹,将上述需要关联存储的各类信息存储在该文件夹中,当用户针对该视图表进行处理时,数据分析客户端可从该视图表对应的文件夹中获取相关信息。
参考图3C为一个视图表对应的编辑页面,左边栏305中显示了从该视图表对应的原始查询语句中解析出的字段,如“uv”、“创建日期”、“api_name”等,若在解析时用户为字段设置了对应的中文名称,则可在左边栏中显示对应的中文名称,如“创建日期”是字段“create_date”的中文名称。用户可以从左边栏中选择绘制数据表时需要使用的字段,将选择的字段添加到维度栏306、数值栏307或条件栏308中。其中,维度栏306中是数据表的横轴对应的字段,用户增加到维度栏306中的字段,会出现在第一查询语句中的GROUP BY子句中。数值栏307中是数据表的纵轴对应的字段,数值栏307中可添加一个或多个字段,用户还可以设置数值栏307中的字段对应的聚合函数,基于聚合函数对字段对应的数据进行相关运算,获得相应的数值,聚合函数包括但不限于:求和函数(Sum)、平均值函数(Average)、最大值函数(Max)、最小值函数(Min)、计数函数(Count)等。条件栏308中是筛选数据时的筛选条件,条件栏308中可设置一个或多个筛选条件,通过在条件栏308中增加字段,来编辑第一查询语句中的WHERE子句,例如,将字段“创建日期”添加到条件栏308,设置的筛选条件为创建日期为2020年4月1日至2020年5月30日,则仅获取创建日期为2020年4月1日至2020年5月30日的数据,基于这些数据绘制数据表309。当然,实际应用中也可以不设置筛选条件。用户设置好维度栏306、数值栏307和条件栏308后,点击完成按钮310,触发数据分析客户端根据维度栏306、数值栏307和条件栏308中的字段,生成第一查询语句,该第一查询语句中的数据源为视图表,SELECT子句中的查询字段为从左边栏305中选择的字段,WHERE子句中的查询条件为条件栏308中设置的筛选条件,因此,该第一查询语句用于指示从视图表中查询字段对应、且满足筛选条件的指定数据,基于获取的指定数据完成数据表的绘制,绘制好的数据表310在编辑页面中显示。
S202、基于原始查询语句,修改第一查询语句,获得用于指示从指定数据库中查询指定数据的第二查询语句。
具体实施时,数据分析客户端从第一查询语句中的数据源子句中提取出视图表的名称,获取该视图表对应的原始查询语句,提取原始查询语句中的数据源(即指定数据库),将第一查询语句中的数据源修改为从原始查询语句中提取的指定数据库,将修改后的第一查询语句作为第二查询语句。由于第二查询语句中的数据源为指定数据库,因此,基于第二查询语句,可直接从指定数据库中获取到指定数据,而无需存储视图表对应的数据,也就不需要更新视图表中的数据了。
S203、基于第二查询语句,获得指定数据。
具体实施时,数据分析客户端将第二查询语句发送给服务器,服务器基于第二查询语句,从指定数据库中获取指定数据,并将获取的指定数据发送给数据分析客户端。数据分析客户端基于服务器返回的指定数据,绘制对应的数据表并显示。图3C中给出了绘制的一个数据表的示例,数据表的横轴为创建日期,纵轴包括基于查询到的数据获得的uv(去重计数值)和pv(计数值)。
本申请实施例提供的一种数据查询方法,在基于视图表进行数据处理时,基于视图表对应的原始查询语句,修改针对视图表的第一查询语句,获得可直接从原始查询语句的指定数据库中查询数据的第二查询语句,基于第二查询语句直接从指定数据库中获取数据,因此,不需要在本地存储视图表中的数据,也就不需要将指定数据库中变化的数据更新到视图表中,也就无需开发和维护复杂的数据可持续更新算法策略,还可以节省大量的本地存储资源,降低了数据分析客户端和服务器的复杂度,且可移植性强。
实际应用中,如果原始查询语句里面已经存在GROUP BY子句、ORDER BY子句、with子句、union子句having子句,在基于用户的操作生成第一查询语句时,又增加了GROUP BY子句,会改变最终查询结果的结果集和数据顺序。为此,在执行步骤S201之前,还需要确认原始查询语句中是否包含GROUP BY子句、ORDER BY子句、with子句、union子句having子句,若不包含上述子句,则执行步骤S201,若包含上述任意一种子句,则使用子查询方式进行数据查询。其中,子查询方式即,先基于原始查询语句从指定数据库中获得数据,再从获得的数据中查询到指定数据,例如,原始查询语句为:SELECT a,sum(b),sum(c)FROM tableGROUP BY a,子查询语句为:SELECTA,B FROM(select a as A,sum(b)as B,sum(c)as CFROM table)as table_alias GROUP BY A ORDER BY B;而采用本申请实施例的方法获得的第二查询语句为:SELECT a as A,sum(b)as B FROM table GROUP BY a ORDER BY sum(b)。
为了使得最终生成的数据表更加简洁、可读性更强,用户可以为原始查询语句中的原始字段设置对应的别名字段,后续数据分析客户端会用原始字段的别名字段替代原始字段,例如,显示原始字段对应的别名字段,基于用户操作生成的第一查询语句中的查询字段也是原始字段对应的别名字段。但是,别名字段是用户自定义的,指定数据库中并不存在别名字段,基于别名字段是无法查询到相应的数据的,为此,需要将第一查询语句中的别名字段替换为对应的原始字段。具体地,步骤S202包括:根据从原始查询语句中获得的表征原始字段和别名字段之间的对应关系,将第一查询语句中的别名字段替换为对应的原始字段;将第一查询语句中的视图表替换为指定数据库;以及将原始查询语句中的查询条件添加到第一查询语句的条件子句中。通过上述方式修改后的第一查询语句,即为需要的第二查询语句。
具体实施时,SELECT子句、WHERE子句、GROUP BY子句以及ORDER BY子句中一般会包含别名字段,需要识别第一查询语句中的SELECT子句、WHERE子句、GROUP BY子句以及ORDER BY子句中的别名字段,然后将识别出的别名字段替换为对应的原始字段。第一查询语句中的数据源为视图表,需要将第一查询语句中的数据源修改为原始查询语句中的指定数据库。
由于第一查询语句是针对视图表所包含的数据的查询语句,相当于需要先基于原始查询语句中的查询条件筛选出目标数据后,再基于第一查询语句中的查询条件,从目标数据中筛选出指定数据,因此,需要将原始查询语句中的筛选条件添加到第一查询语句的条件子句中。
具体实施时,对查询语句进行SQL解析,获取SELECT、FROM、WHERE、GROUP BY、ORDERBY等查询关键字,基于这些查询关键字划分出SELECT子句、FROM子句、WHERE子句、GROUP BY子句、ORDER BY子句等。
SQL解析包括词法分析和语法/语义分析。词法分析主要是把查询语句转化成多个Token,Token可以是Keyword(也称symbol),也可以是非Keyword。例如,对查询语句“SELECTusername FROM userinfo”进行词法分析,可获得4个Token,其中属于Keyword的Token是SELECT和FROM。语法分析是在词法分析的基础上,判断查询语句中的单词是否符合语法逻辑,例如,“SELECT FOO+100FROM POKES”就是一个符合语法的句子,而“SELECT FOO+100FROM”是个不合法的语句,因为在FROM之后一定要跟着一个表名,此时语法分析器会报错。词法分析和语法分析为现有技术,不再赘述。通过词法分析和语法分析后,可获取如图4所示的抽象语法树,抽象语法树是查询语句的树形结构的表现形式,抽象语法树上的每一个节点都对应一个单词,抽象语法树的结构体现了语法,抽象语法树是随着语法分析的过程构造的,当语法分析正常结束后,语法分析器就会输出一个抽象语法树,查询语句和抽象语法树的结构内容是一一对应的,例如,节点SELECT对应关键词SELECT,节点Fields对应查询字段子句,查询字段子句又可以进一步划分为多个节点,如username和ismale,节点FROM对应关键词FROM,节点Tables对应数据源子句,数据源子句又可以划分出节点userinfo,节点WHERE对应关键词WHERE,节点Conditions对应条件子句,条件子句又可以进一步划分为多个节点。
具体实施时,参考图5,可通过以下方法获取对应关系:
S501、基于查询字段分割符,将查询字段子句切分为多个查询字段。
具体地,获取抽象语法树中的节点Fields的子树部分,合并节点Fields的子树部分,获得查询字段子句。
其中,查询字段分割符是查询字段子句中用于分割各个查询字段的字符,一般查询字段分割符为逗号。例如,“SELECT create_user AS count_create_user,api_name,page_id”中,查询字段“create_user AS count_create_user”和“api_name”之间通过逗号隔开。
实际应用中,SELECT子句中常常会包含一些函数,这些函数中会包含与查询字段分隔符相同的符号,如“date_format(create_time,'%Y-%m-%d')AS create_date”,这些逗号通常出现在括号中。为此,在将查询字段子句切分为多个查询字段前,需要先将查询字段子句中括号内的与查询字段分隔符相同的符号,替换为预设的特殊字符,再基于查询字段分割符,将替换符号后的查询字段切分为多个查询字段,最后,将多个查询字段中的特殊字符替换为查询字段分割符,这样可以方式误切分。
S502、针对包含别名定义字符的任一查询字段,从任一查询字段中获取具有对应关系的原始字段和别名字段,其中,别名定义字符为用于定义原始字段和别名字段之间具有对应关系的字符。
其中,别名定义字符是由SQL语句确定的,别名定义字符可以是AS、CASE或空格符。可通过正则匹配的方式,识别查询字段中包含的别名定义字符。
具体实施时,步骤S502具体包括以下步骤:
若任一查询字段中包含的别名定义字符为AS,则将任一查询字段中AS之前的字段确定为原始字段,将任一查询字段中AS之后的字段确定为原始字段对应的别名字段;
若任一查询字段中包含的别名定义字符为CASE,则将任一查询字段中CASE和END之间的字段确定为原始字段,将任一查询字段中END之后的字段确定为原始字段对应的别名字段;
若任一查询字段不包含AS和CASE,且任一查询字段中包含空格符,则将任一查询字段中空格符之前的字段确定为原始字段,将任一查询字段中空格符之后的字段确定为原始字段对应的别名字段。
例如,查询字段“Sum(C+2)AS c”中的原始字段为“Sum(C+2)”,别名字段为“c”。查询字段“CASE WHEN substr(E,9,2)<‘06’THEN‘夜宵’WHEN substr(E,9,2)<‘10’THEN‘早餐’WHEN substr(E,9,2)<‘15’THEN‘午餐’WHEN substr(E,9,2)<‘20’THEN‘晚餐’ELSE‘夜宵’AS e”中的原始字段为“WHEN substr(E,9,2)<‘06’THEN‘夜宵’WHEN substr(E,9,2)<‘10’THEN‘早餐’WHEN substr(E,9,2)<‘15’THEN‘午餐’WHEN substr(E,9,2)<‘20’THEN‘晚餐’ELSE‘夜宵’”,别名字段为“e”。查询字段“B b”中的B和b之间为空格符,因此,原始字段为“B”,别名字段为“b”。
在上述任一实施方式的基础上,本申请实施例的数据查询方法还包括如下步骤:若别名字段对应的原始字段已使用聚合函数,则将别名字段标记为不能使用聚合函数的字段;当对标记为不能使用聚合函数的字段使用聚合函数时,输出不能使用聚合函数的提示信息。
例如,“Sum(C+2)AS c”中,别名字段c对应的原始字段Sum(C+2)就已经使用了聚合函数Sum,因此c实际上是一个数值,无法对该数值使用聚合函数,因此,数据分析客户端会将别名字段c标记为不能使用聚合函数的字段。当用户想将别名字段c添加到数值栏中时,会生成该别名字段不能使用聚合函数的提示信息,防止因二次聚合导致的错误。
在上述任一实施方式的基础上,可通过如下方式,将原始查询语句中的查询条件添加到第一查询语句的条件子句中:在第一查询语句的条件子句中的查询条件之前,添加原始查询语句中的查询条件。
例如,原始查询语句中的查询条件为:A>10and B<1,第一查询语句的条件子句为:WHERE C>2,则第二查询语句的条件子句为:WHERE A>10and B<1and C>2。这样,会优先执行原始查询语句中的查询条件,再执行第一查询语句中的查询条件,提高索引命中率。
在上述任一实施方式的基础上,用户还可以在输入原始查询语句的条件子句中添加表示自定义条件的占位符,方便后续用户可以自定义查询条件。参考图3C,用户可通过条件栏中的自定义条件输入框,输入自定义查询条件。
基于此,本申请实施例的方法还包括如下步骤:若确定第一查询语句中包含自定义查询条件,则删除第一查询语句中的自定义查询条件,并将添加到第一查询语句中的占位符替换为自定义查询条件。
例如,原始查询语句的条件子句为:WHERE A>100and D{D},其中D{D}为自定义条件的占位符,当用户输入名称为D的筛选条件时,例如D>100,那么会将D{D}替换为D>100。例如,用户输入的条件为:WHERE C>2and D>100,先将原始查询语句的查询条件添加到第一查询语句中,获得的条件子句为:WHERE A>100and D{D}and C>2and D>100,再删除上述条件句子中的D>100,并将D{D}整体替换为D>100,最终获得的第二查询语句的条件子句为:WHERE A>100and D>100and C>2。若用户没有输入自定义查询条件,则数据分析客户端会将D{D}会被整体替换为1=1,由于条件1=1为ture,服务器执行1=1后,不影响查询结果和查询性能。
实际应用中,基于用户输入的原始查询语句Q0生成一级视图表,原始查询语句Q0用于指示从指定数据库中查询数据,用户还可以针对一级视图表进行查询操作,此时,数据分析客户端会基于针对一级视图表输入的查询语句Q1,生成新的二级视图表。当用户对二级视图表进行查询操作时,数据分析客户端获取用于指示从二级视图表中查询指定数据的查询语句Q2,基于查询语句Q1修改查询语句Q2,获得用于指示从一级视图表中查询指定数据的查询语句Q’2;然后,基于原始查询语句Q0修改查询语句Q’2,获得用于指示从指定数据库中查询指定数据的查询语句Q”2;基于该查询语句Q”2,从指定数据库中获得指定数据。
其中,基于查询语句Q1修改查询语句Q2的方式,可参考本申请实施例中提供的基于原始查询语句修改第一查询语句的具体实施方式,例如,根据从查询语句Q1中获得的表征原始字段和别名字段之间的对应关系,将查询语句Q2中的别名字段替换为对应的原始字段;将查询语句Q2中的视图表替换为查询语句Q1中的数据源(即一级视图表);以及将查询语句Q1中的查询条件添加到查询语句Q2的条件子句中。其中,可参考图5所示的方式,从查询语句Q1中获得表征原始字段和别名字段之间的对应关系。
其中,基于原始查询语句Q0修改查询语句Q’2的具体实施方式,可参考本申请实施例中提供的基于原始查询语句修改第一查询语句的具体实施方式,不再赘述。
当然,用户还可以基于二级视图表建立三级视图表,基于三级视图表建立四级视图表,以此类推。在数据查询时,在获取到用于指示从N级视图表中查询指定数据的查询语句QN时,基于N-1级视图表对应的查询语句QN-1,修改查询语句QN,获得用于指示从N-1级视图表中查询指定数据的查询语句Q’N;基于N-2级视图表对应的查询语句QN-2,修改查询语句Q’N,获得用于指示从N-2级视图表中查询指定数据的查询语句Q”N;以此类推,通过逐级递归优化查询语句的方式,可将针对N级视图表的查询语句,最终转换为直接从指定数据中查询数据的查询语句,即不包含子查询的查询语句,进而提高查询效率,优化查询性能。
如图6所示,基于与上述数据查询方法相同的发明构思,本申请实施例还提供了一种数据查询装置60,包括获取模块601、修改模块602和查询模块603。
获取模块601,用于获取用于指示从视图表中查询指定数据的第一查询语句,视图表是基于原始查询语句生成的,原始查询语句用于指示从指定数据库中查询数据;
修改模块602,用于基于原始查询语句,修改第一查询语句,获得用于指示从指定数据库中查询指定数据的第二查询语句;
查询模块603,用于基于第二查询语句,获得指定数据。
可选地,修改模块602,具体用于:根据从原始查询语句中获得的表征原始字段和别名字段之间的对应关系,将第一查询语句中的别名字段替换为对应的原始字段;将第一查询语句中的视图表替换为指定数据库;以及将原始查询语句中的查询条件添加到第一查询语句的条件子句中。
可选地,数据查询装置60还包括解析模块604,用于通过以下方法获取对应关系:
基于查询字段分割符,将查询字段子句切分为多个查询字段;
针对包含别名定义字符的任一查询字段,从任一查询字段中获取具有对应关系的原始字段和别名字段,其中,别名定义字符为用于定义原始字段和别名字段之间具有对应关系的字符。
可选地,解析模块604,具体用于:
若任一查询字段中包含的别名定义字符为AS,则将任一查询字段中AS之前的字段确定为原始字段,将任一查询字段中AS之后的字段确定为原始字段对应的别名字段;
若任一查询字段中包含的别名定义字符为CASE,则将任一查询字段中CASE和END之间的字段确定为原始字段,将任一查询字段中END之后的字段确定为原始字段对应的别名字段;
若任一查询字段不包含AS和CASE,且任一查询字段中包含空格符,则将任一查询字段中空格符之前的字段确定为原始字段,将任一查询字段中空格符之后的字段确定为原始字段对应的别名字段。
可选地,解析模块604,具体用于:
将查询字段子句中括号内的与查询字段分隔符相同的符号,替换为预设的特殊字符;
基于查询字段分割符,将替换符号后的查询字段切分为多个查询字段;
将多个查询字段中的特殊字符替换为查询字段分割符。
可选地,数据查询装置60还包括标记模块,用于:
若别名字段对应的原始字段已使用聚合函数,则将别名字段标记为不能使用聚合函数的字段;
当对标记为不能使用聚合函数的字段使用聚合函数时,输出不能使用聚合函数的提示信息。
可选地,修改模块602,具体用于:在第一查询语句的条件子句中的查询条件之前,添加原始查询语句中的查询条件。
可选地,当原始查询语句的条件子句中包含自定义条件对应的占位符时,修改模块602,还用于若确定第一查询语句中包含自定义查询条件,则删除第一查询语句中的自定义查询条件,并将添加到第一查询语句中的占位符替换为自定义查询条件。
本申请实施例提的数据查询装置与上述数据查询方法采用了相同的发明构思,能够取得相同的有益效果,在此不再赘述。
基于与上述数据查询方法相同的发明构思,本申请实施例还提供了一种电子设备,该电子设备具体可以为桌面计算机、便携式计算机、智能手机、平板电脑、个人数字助理(Personal Digital Assistant,PDA)、服务器等。如图7所示,该电子设备70可以包括处理器701和存储器702。
处理器701可以是通用处理器,例如中央处理器(CPU)、数字信号处理器(DigitalSignal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本申请实施例中公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器702作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块。存储器可以包括至少一种类型的存储介质,例如可以包括闪存、硬盘、多媒体卡、卡型存储器、随机访问存储器(Random Access Memory,RAM)、静态随机访问存储器(Static Random Access Memory,SRAM)、可编程只读存储器(Programmable Read Only Memory,PROM)、只读存储器(Read Only Memory,ROM)、带电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM)、磁性存储器、磁盘、光盘等等。存储器是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。本申请实施例中的存储器702还可以是电路或者其它任意能够实现存储功能的装置,用于存储程序指令和/或数据。
本申请实施例提供了一种计算机可读存储介质,用于储存为上述电子设备所用的计算机程序指令,其包含用于执行上述数据查询方法的程序。
上述计算机存储介质可以是计算机能够存取的任何可用介质或数据存储设备,包括但不限于磁性存储器(例如软盘、硬盘、磁带、磁光盘(MO)等)、光学存储器(例如CD、DVD、BD、HVD等)、以及半导体存储器(例如ROM、EPROM、EEPROM、非易失性存储器(NAND FLASH)、固态硬盘(SSD))等。
以上实施例仅用以对本申请的技术方案进行了详细介绍,但以上实施例的说明只是用于帮助理解本申请实施例的方法,不应理解为对本申请实施例的限制。本技术领域的技术人员可轻易想到的变化或替换,都应涵盖在本申请实施例的保护范围之内。