大家好,才是真的好。好像没多久,但转眼一看,已经过了一个星期,就是一周以前,我发了一篇Domino查询语言语法解析(一),不知道大家忘记了没?语法解析一只是一个入门,今天我们继续来讨论一下DQL的语法。
一、逻辑运算符和顺序
大家还记得逻辑符吗?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’文件夹或视图中的那些文档。
三、几个问题
Q1:DQL中的语句区分大小写吗?比如字段名和字段中的值?
A1: 目前就我测试的结果来看,不区分。
Q2: 执行DQL语句搜索的数据库是不是需要建立索引。
A2:就目前测试来看,不需要。只需要执行我在前面一篇中提到的几个步骤即可。
Q3:以前我们知道,使用数据库索引搜索文档之前,必须要更新索引,DQL搜索执行时,是不是每次都需要更新相应的索引?
A3:不需要执行任何索引更新,DQL直接在数据库中进行搜索。
好了,如果你有更多问题,欢迎给我留言。
更多精彩内容可关注微信公众号:“协作者”