HCL 中文技术社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 878|回复: 0

Domino查询语言DQL语法解析

[复制链接] TA的帖子

91

主题

123

帖子

2599

积分

超级版主

Rank: 8Rank: 8

积分
2599

活跃会员热心会员灌水之王最佳新人

发表于 2020-9-23 14:37:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
原文地址:https://mp.weixin.qq.com/s?__biz ... 6&lang=zh_CN#rd

一、DQL语法结构


        其实也很简单,语法结构主要是:



        Term Boolean Term [Boolean Term …]



        Term即术语,Boolean即逻辑符。初看起来就是“术语加逻辑符”,用空格间隔。可是Term有哪些,逻辑符又有哪些呢?



二、Tearm术语

        Term由三个部分构成:标识符、操作符、值。其语法为:

        [Identifier] Operator [Value]



        继续深入下去,标识符又分为三种类型:汇总字段(字段名)、视图或文件夹.列名、@函数。其中视图或文件夹.列名中的列名必须是主要的可排序的列名称;函数则主要有@all、@ModifiedInThisFile 、@DocumentUniqueID和@Created等。



        操作符有= 、> 、>= 、 < 、 <= 和in [all]等。



        值也有三种,对应三种字段数值类型:文本、时间日期和数字。



三、逻辑符

        逻辑符由"and"、"or"、"and not"、"or not"等四个组成。熟悉一点其他脚本或编程语言的朋友,应该对这四个单词非常熟悉,所以不过多地进行解释了。



四、几个简单的例子



    虽然DQL并不复杂,但听起来很有点枯燥,幸亏我们可以举些例子,以加深大家的理解。



       A、如要查询订单号在146751和150111(包括150111)之间的所有文档,则查询语句应该这么写:



        order_no > 146751 and order_no <= 150111



        是不是很简单,像以前的公式?现在我们稍微看一个复杂一点的,还记得操作符号in [all]吗?



        B、下列代码的意思是找出username字段中包含'Chad Keighley’, ‘Jeff Chantel’, ‘Louis Cawlfield’, ‘Mariel Nathanson’任意一个名字的所有文档。



        username in (‘Chad Keighley’, ‘Jeff Chantel’, ‘Louis Cawlfield’, ‘Mariel Nathanson’)



       C、下面用一个值为日期的查找文档方法,比如找到字段date_origin日期值在2018年10月10号以后的所有文档



        date_origin > @dt(‘20181010T100000+0500’)  



        时间日期值是GMT或ZULU时间格式中指定的ISO8601兼容值,一般会用公式@dt(‘datetime value’)进行获取或处理。





       D、如果查找Orders视图中的order_type为Phone的所有文档,其语句为



          ‘Orders’.order_type = ‘Phone’  



        E、在‘Orders’, ’Special orders folder 1’, ‘Old_orders 2’视图或文件夹中找所有的文档



        in (‘Orders’, ’Special orders folder 1’, ‘Old_orders 2’)


五、逻辑运算符和顺序



        大家还记得逻辑符吗?and、or、and not、or not四个,即且、或、且否、或否。比如以下语句:



        Order_origin in (‘London’, ‘LA’, ‘Tokyo’) AND date_origin > @dt(‘20160511’) or partno = 388388



        猜一猜这段代码的执行吧?从某个数据库中取出,Order_origin字段值为London, LA, Tokyo中的一个且date_origin字段值必须为2016年5月11号以后的所有文档,或者partno字段值为388388的文档。这个和执行的先后顺序有关,默认地,DQL按照语句的先后顺序执行。



        当然,下面这段,因为后面的or语句被整体括号在一块,所以会优先执行



            ‘Soon to be special’.Status = ‘Shipping’ and ( order_origin = ‘LA’ or sales_person in    (‘Chad Keighley’, ‘Jeff Chantel’, ‘Louis Cawlfield’, ‘Mariel Nathanson’))



        其意思正是,先取出date_origin字段值为LA,或sales_person字段值为

‘Chad Keighley’, ‘Jeff Chantel’, ‘Louis Cawlfield’, ‘Mariel Nathanson’中的一个,符合这些条件的所有文档,而后且这些文档要符合在名为Soon to be special(谁会取这种名字?)视图中的Status列值为Shipping。



        下面这个语句则更进一步使用or Not逻辑符,返回的那些文档,必须符合名为Soon to be special视图中的Status列值为Inventory,并且order_origin为Detroit,sales_person不能为‘Harold Cunningham’, ‘Julie Leach’, ‘Gordon Smith’, ‘Terence Henry’中的一个。



         ‘Soon to be special’.Status = ‘Inventory’ and ( order_origin = ‘Detroit’ or NOT sales_person in                                           (‘Harold Cunningham’, ‘Julie Leach’, ‘Gordon Smith’, ‘Terence Henry’))



六、in all语句

   in前面我们使用过,在后面加上一个all语句,则是必须包含括号中的所有值,比如Part_no in all ( 389, 27883, 388388, 587992 ) ,文档中的Part_no必须同时包含389, 27883, 388388, 587992四个值,而categories In all ('test1','test2') " 意思是categories必须拥有test1和test2两个值,如下图

    而后可以获得这个文档

像语句in all (‘Orders’, ’Special orders folder 1’, ‘Old_orders 2’) 则是指必须同时出现在‘Orders’, ’Special orders folder 1’, ‘Old_orders 2’文件夹或视图中的那些文档。

    in前面我们使用过,在后面加上一个all语句,则是必须包含括号中的所有值,比如Part_no in all ( 389, 27883, 388388, 587992 ) ,文档中的Part_no必须同时包含389, 27883, 388388, 587992四个值,而categories In all ('test1','test2') " 意思是categories必须拥有test1和test2两个值,如下图


22.png


        而后可以获得这个文档

23.png




        像语句in all (‘Orders’, ’Special orders folder 1’, ‘Old_orders 2’) 则是指必须同时出现在‘Orders’, ’Special orders folder 1’, ‘Old_orders 2’文件夹或视图中的那些文档。


七、几个问题

Q1:DQL中的语句区分大小写吗?比如字段名和字段中的值?

A1:  目前就我测试的结果来看,不区分。



Q2: 执行DQL语句搜索的数据库是不是需要建立索引。

A2:就目前测试来看,不需要。只需要执行我在前面一篇中提到的几个步骤即可。



Q3:以前我们知道,使用数据库索引搜索文档之前,必须要更新索引,DQL搜索执行时,是不是每次都需要更新相应的索引?

A3:不需要执行任何索引更新,DQL直接在数据库中进行搜索。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|HCL 中文技术社区 ( 沪ICP备17044822号 )

GMT+8, 2022-6-27 22:13 , Processed in 1.079662 second(s), 25 queries .

快速回复 返回顶部 返回列表