各种笔记
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

239 lines
9.9 KiB

  1. 经营者
  2. AQL支持许多可在表达式中使用的运算符。有比较,逻辑,算术和三元运算符。
  3. 比较运算符
  4. 比较(或关系)运算符比较两个操作数。它们可以与任何输入数据类型一起使用,并将返回布尔结果值。
  5. 支持以下比较运算符:
  6. 操作员 描述
  7. == 平等
  8. != 不等式
  9. < 少于
  10. <= 小于或等于
  11. > 比...更棒
  12. >= 大于或等于
  13. IN 测试值是否包含在数组中
  14. NOT IN 测试值是否不包含在数组中
  15. LIKE 测试字符串值是否与模式匹配
  16. NOT LIKE 测试字符串值是否与模式不匹配
  17. =~ 测试字符串值是否与正则表达式匹配
  18. !~ 测试字符串值是否与正则表达式不匹配
  19. 如果可以评估比较结果,则每个比较运算符都将返回一个布尔值;如果比较结果为true,则返回true;否则返回false 。
  20. 比较运算符接受第一和第二操作数的任何数据类型。但是,IN并且NOT IN仅在其右侧操作数是数组的情况下才会返回有意义的结果。LIKE并且NOT LIKE仅在两个操作数均为字符串值时才执行。如果比较的操作数具有不同或不合理的类型,则比较运算符将不执行任何隐式类型转换。
  21. AQL中比较操作的一些示例:
  22. 0 == null // false
  23. 1 > 0 // true
  24. true != null // true
  25. 45 <= "yikes!" // true
  26. 65 != "65" // true
  27. 65 == 65 // true
  28. 1.23 > 1.32 // false
  29. 1.5 IN [ 2, 3, 1.5 ] // true
  30. "foo" IN null // false
  31. 42 NOT IN [ 17, 40, 50 ] // true
  32. "abc" == "abc" // true
  33. "abc" == "ABC" // false
  34. "foo" LIKE "f%" // true
  35. "foo" NOT LIKE "f%" // false
  36. "foo" =~ "^f[o].$" // true
  37. "foo" !~ "[a-z]+bar$" // true
  38. 该LIKE运营商检查是否其左操作数以其右操作数指定的模式相匹配。该模式可以包含常规字符和通配符。支持的通配符_将匹配单个任意字符,并%匹配任意数量的任意字符。文字%,_需要以反斜杠转义。反斜杠需要自己转义,这实际上意味着两个反斜线字符必须在文字百分号或下划线之前。在arangosh中,需要进行额外的转义,使其在要转义的字符之前总共加四个反斜杠。
  39. "abc" LIKE "a%" // true
  40. "abc" LIKE "_bc" // true
  41. "a_b_foo" LIKE "a\\_b\\_foo" // true
  42. LIKE操作员执行的模式匹配区分大小写。
  43. 该NOT LIKE经营者具有相同特性的LIKE运营商,但与否定的结果。因此,它与相同NOT (… LIKE …)。请注意括号,这对于某些表达式是必需的:
  44. FOR doc IN coll
  45. RETURN NOT doc.attr LIKE "…"
  46. return表达式将转换为LIKE(!doc.attr, "…"),从而产生意外结果。NOT(doc.attr LIKE "…")变得更加合理! LIKE(doc.attr, "…")。
  47. 正则表达式运算符=~并!~期望它们的左手操作数是字符串,而期望它们的右手操作数是包含有效的正则表达式的字符串,如AQL函数REGEX_TEST()的文档中所指定 。
  48. 数组比较运算符
  49. 比较运算符也作为数组变量存在。在阵列变型中,操作者的前缀的关键字之一ALL,ANY 或NONE。使用这些关键字之一可以更改操作员的行为,以便对其所有,任何或不使用其左手参数值执行比较操作。因此,期望数组运算符的左手参数是一个数组。
  50. 例子:
  51. [ 1, 2, 3 ] ALL IN [ 2, 3, 4 ] // false
  52. [ 1, 2, 3 ] ALL IN [ 1, 2, 3 ] // true
  53. [ 1, 2, 3 ] NONE IN [ 3 ] // false
  54. [ 1, 2, 3 ] NONE IN [ 23, 42 ] // true
  55. [ 1, 2, 3 ] ANY IN [ 4, 5, 6 ] // false
  56. [ 1, 2, 3 ] ANY IN [ 1, 42 ] // true
  57. [ 1, 2, 3 ] ANY == 2 // true
  58. [ 1, 2, 3 ] ANY == 4 // false
  59. [ 1, 2, 3 ] ANY > 0 // true
  60. [ 1, 2, 3 ] ANY <= 1 // true
  61. [ 1, 2, 3 ] NONE < 99 // false
  62. [ 1, 2, 3 ] NONE > 10 // true
  63. [ 1, 2, 3 ] ALL > 2 // false
  64. [ 1, 2, 3 ] ALL > 0 // true
  65. [ 1, 2, 3 ] ALL >= 3 // false
  66. ["foo", "bar"] ALL != "moo" // true
  67. ["foo", "bar"] NONE == "bar" // false
  68. ["foo", "bar"] ANY == "foo" // true
  69. 请注意,这些运算符尚未优化。索引将不被使用。
  70. 逻辑运算符
  71. AQL支持以下逻辑运算符:
  72. && 逻辑与运算符
  73. || 逻辑或运算符
  74. ! 逻辑非/否定运算符
  75. AQL还支持逻辑运算符的以下替代形式:
  76. AND 逻辑与运算符
  77. OR 逻辑或运算符
  78. NOT 逻辑非/否定运算符
  79. 替代形式是别名,在功能上等同于常规运算符。
  80. AQL中的两个操作数逻辑运算符将使用短路求值执行(除非其中一个操作数是子查询或包含子查询。在这种情况下,子查询将在逻辑运算符之前被提取一个求值)。
  81. AQL中逻辑运算符的结果定义如下:
  82. lhs && rhslhs如果是false或将false转换为布尔值时将返回。如果将lhsis true或be true转换为布尔值, rhs则将返回。
  83. lhs || rhslhs如果是true或将true转换为布尔值时将返回。如果将lhsis false或be false转换为布尔值, rhs则将返回。
  84. ! value将返回value转换为布尔值的取反值
  85. AQL中逻辑操作的一些示例:
  86. u.age > 15 && u.address.city != ""
  87. true || false
  88. NOT u.isInvalid
  89. 1 || ! 0
  90. 允许将非布尔值传递给逻辑运算符。任何非布尔操作数都将由运算符隐式转换为布尔值,而不会使查询中止。
  91. 在一个布尔值转换的工作原理如下:
  92. null 将被转换为 false
  93. 布尔值保持不变
  94. 所有不等于零的数字为true,零为false
  95. 空字符串是false,所有其他字符串是true
  96. 数组([ ])和对象/文档({ })是true不论其内容如何
  97. 逻辑和与逻辑或运算的结果现在可以具有任何数据类型,并且不一定是布尔值。
  98. 例如,以下逻辑运算将返回布尔值:
  99. 25 > 1 && 42 != 7 // true
  100. 22 IN [ 23, 42 ] || 23 NOT IN [ 22, 7 ] // true
  101. 25 != 25 // false
  102. …,而以下逻辑运算将不会返回布尔值:
  103. 1 || 7 // 1
  104. null || "foo" // "foo"
  105. null && true // null
  106. true && 23 // 23
  107. 算术运算符
  108. 算术运算符对两个数字操作数执行算术运算。算术运算的结果还是一个数值。
  109. AQL支持以下算术运算符:
  110. + 加成
  111. - 减法
  112. * 乘法
  113. / 师
  114. % 模数
  115. 一元加号和一元减号也受支持:
  116. LET x = -5
  117. LET y = 1
  118. RETURN [-x, +y]
  119. // [5, 1]
  120. 为了求幂,有一个数字函数 POW()。base ** exp不支持语法。
  121. 对于字符串连接,必须使用字符串函数 CONCAT()。将两个字符串与加号("foo" + "bar")结合使用将不起作用!另请参阅常见错误。
  122. 一些算术运算示例:
  123. 1 + 1
  124. 33 - 99
  125. 12.4 * 4.5
  126. 13.0 / 0.1
  127. 23 % 7
  128. -15
  129. +9.99
  130. 算术运算符接受任何类型的操作数。将非数字值传递给算术运算符将使用TO_NUMBER()函数应用的类型转换规则将操作数转换为数字:
  131. null 将被转换为 0
  132. false将转换为0,将true转换为1
  133. 有效数值保持不变,但NaN和Infinity将转换为 0
  134. 如果字符串值包含数字的有效字符串表示形式,则将它们转换为数字。字符串开头或结尾的所有空格都将被忽略。具有其他内容的字符串将转换为数字0
  135. 将一个空数组转换为0,将具有一个成员的数组转换为其唯一成员的数字表示形式。具有更多成员的数组将转换为number 0。
  136. 对象/文档将转换为数字0。
  137. 产生无效值的算术运算,例如1 / 0(除以零)也将产生结果值null。该查询不会终止,但是您可能会看到警告。
  138. 这里有一些例子:
  139. 1 + "a" // 1
  140. 1 + "99" // 100
  141. 1 + null // 1
  142. null + 1 // 1
  143. 3 + [ ] // 3
  144. 24 + [ 2 ] // 26
  145. 24 + [ 2, 4 ] // 0
  146. 25 - null // 25
  147. 17 - true // 16
  148. 23 * { } // 0
  149. 5 * [ 7 ] // 35
  150. 24 / "12" // 2
  151. 1 / 0 // 0
  152. 三元运算符
  153. AQL还支持可用于条件评估的三元运算符。三元运算符期望布尔条件作为其第一个操作数,如果条件的计算结果为true,则返回第二个操作数的结果,否则返回第三个操作数。
  154. 例子
  155. u.age > 15 || u.active == true ? u.userId : null
  156. 还有只有两个操作数的三元运算符的快捷方式。当布尔条件的表达式和返回值应该相同时,可以使用此变体:
  157. 例子
  158. u.value ? : 'value is null, 0 or not present'
  159. 范围运算符
  160. AQL支持使用..运算符表达简单的数字范围。该运算符可用于轻松地迭代数字序列。
  161. 所述..操作者将产生整数值的阵列在所定义的范围内,与两个边界值包括在内。
  162. 例子
  163. 2010..2013
  164. 将产生以下结果:
  165. [ 2010, 2011, 2012, 2013 ]
  166. 使用范围运算符等效于编写一个整数值的数组,该整数值在范围的边界所指定的范围内。如果范围运算符的边界为非整数,则它们将首先转换为整数值。
  167. 还有一个RANGE()函数。
  168. 数组运算符
  169. AQL提供阵列运营商[*]为 数组变量扩展和 [**]用于阵列收缩。
  170. 运算符优先级
  171. AQL中的运算符优先级与其他熟悉的语言相似(最低优先级优先):
  172. 运营商 描述
  173. , 逗号分隔符
  174. DISTINCT 独特修饰符(返回操作)
  175. ? : 三元运算符
  176. = 变量赋值(LET操作)
  177. WITH 与运算符一起(WITH / UPDATE / REPLACE / COLLECT操作)
  178. INTO 进入运算符(INSERT / UPDATE / REPLACE / REMOVE / COLLECT操作)
  179. || 逻辑或
  180. && 逻辑与
  181. OUTBOUND,INBOUND,ANY,ALL,NONE 图遍历方向,数组比较运算符
  182. ==,!=,LIKE,NOT LIKE,=~,!~ (in)相等,通配符(非)匹配,正则表达式(非)匹配
  183. IN, NOT IN (不是)在运算符中
  184. <<=,>=,> 小于,小于等于,大于等于,大于
  185. .. 范围运算符
  186. +, - 加,减
  187. *,/,% 乘法,除法,模
  188. !,+,- 逻辑否定,一元加,一元减
  189. () 函数调用
  190. . 会员访问
  191. [] 索引值访问
  192. [*] 扩张
  193. :: 范围
  194. 括号(和)可用于强制执行不同的操作员评估顺序。