常用運算符
AQL支持許多可以在表達式中使用的運算符。有比較,邏輯,算術和三元運算符。
比較運算符
比較(或關係)運算符比較兩個操作數。它們可以用於任何輸入數據類型,並將返回一個布爾結果值。
支持以下比較運算符:
== 等於
!= 不等於
< 小於
<= 小於或等於
> 大於
> = 大於或等於
IN 測試數組中是否包含值
NOT IN 測試一個值是否不包含在數組中
LIKE測試字符串值是否與模式匹配
=〜 測試字符串值是否與正則表達式匹配
!〜 測試字符串值是否與正則表達式不匹配
如果可以評估比較結果,則每個比較運算符都返回一個布爾值,如果比較結果為真,則返回true;否則返回false 。
比較運算符接受第一個和第二個操作數的任何數據類型。但是,如果IN和NOT IN的右邊的操作數是一個字符串,它只會返回一個有意義的結果,而LIKE只有在兩個操作數都是字符串值時才會執行。如果比較操作數具有不同或不合理的類型,則比較運算符不會執行任何隱式類型轉換。
AQL中比較操作的一些示例:
0 == null // false
1 > 0 // true
true != null // true
45 <= "yikes!" // true
65 != "65" // true
65 == 65 // true
1.23 > 1.32 // false
1.5 IN [ 2, 3, 1.5 ] // true
"foo" IN null // false
42 NOT IN [ 17, 40, 50 ] // true
"abc" == "abc" // true
"abc" == "ABC" // false
"foo" LIKE "f%" // true
"foo" =~ "^f[o].$" // true
"foo" !~ "[a-z]+bar$" // true
在LIKE操作符檢查其左操作數是否與其右操作數指定的模式相匹配。該模式可以由常規字符和通配符組成。支持的通配符是_來匹配任意一個字符,而%可以匹配任意數量的任意字符。%和_需要用反斜線進行轉義。在arangosh中,需要額外的轉義,使得總共有四個反斜槓在要escape的字符之前。
"abc" LIKE "a%" // true
"abc" LIKE "_bc" // true
"a_b_foo" LIKE "a\\_b\\_foo" // true
由LIKE運算符執行的模式匹配區分大小寫。
正則表達式operators =〜和!〜期望它們的左操作數是字符串,右操作數是包含有效正則表達式的字符串,如AQL函數REGEX_TEST()的文檔中所指定的 。
數組比較運算符
比較運算符也作為數組變量存在。在數組變量中,操作符的前綴是關鍵字ALL,ANY 或NONE之一。使用這些關鍵字中的一個更改運算符行為以執行其左參數值的ALL、ANY或NONE的比較操作。因此,期望數組運算符的左參數是數組。
例子:
[ 1, 2, 3 ] ALL IN [ 2, 3, 4 ] // false
[ 1, 2, 3 ] ALL IN [ 1, 2, 3 ] // true
[ 1, 2, 3 ] NONE IN [ 3 ] // false
[ 1, 2, 3 ] NONE IN [ 23, 42 ] // true
[ 1, 2, 3 ] ANY IN [ 4, 5, 6 ] // false
[ 1, 2, 3 ] ANY IN [ 1, 42 ] // true
[ 1, 2, 3 ] ANY == 2 // true
[ 1, 2, 3 ] ANY == 4 // false
[ 1, 2, 3 ] ANY > 0 // true
[ 1, 2, 3 ] ANY <= 1 // true
[ 1, 2, 3 ] NONE < 99 // false
[ 1, 2, 3 ] NONE > 10 // true
[ 1, 2, 3 ] ALL > 2 // false
[ 1, 2, 3 ] ALL > 0 // true
[ 1, 2, 3 ] ALL >= 3 // false
["foo", "bar"] ALL != "moo" // true
["foo", "bar"] NONE == "bar" // false
["foo", "bar"] ANY == "foo" // true
請注意,這些運算符尚未優化。索引不會被利用。
邏輯運算符
AQL支持以下邏輯運算符:
&&邏輯和運算符
|| 邏輯或運算符
!邏輯非/否定運算符
AQL還支持邏輯運算符的以下替代形式:
AND邏輯和運算符
OR邏輯或運算符
NOT 邏輯非/否定運算符
替代形式是別名,在功能上等同於常規運算符。
AQL中的兩個操作數,邏輯運算符將對其執行短路評估(除非其中一個操作數是或包含子查詢)。在這種情況下,子查詢將被拉出,在邏輯運算符之前進行評估。
AQL中邏輯運算符的結果定義如下:
lhs && rhs 如果lhs是false或將被轉換成false,則返回lhs。如果lhs是true或將被轉換為true, rhs將被返回。
lhs || rhs 如果lhs是true或將被轉換為true,則返回lhs。如果lhs是false或將被轉換為false, rhs將被返回。
! value 將返回value轉換的否定值為布爾值
AQL中邏輯操作的一些示例:
u.age > 15 && u.address.city != ""
true || false
NOT u.isInvalid
1 || ! 0
允許將非布爾值傳遞給邏輯運算符。任何非布爾操作數將被操作符隱式轉換為布爾值,而不會使查詢中止。
在一個布爾值轉換的工作原理如下:
null 將被轉換為 false
布爾值保持不變
所有不等於零的數字都是true零false
一個空字符串是false,所有其他字符串都是true
無論數組的內容如何,數組([ ])和對象/文檔({ })都是true
邏輯和、邏輯或運算的結果現在可以具有任何數據類型,並且不一定是布爾值。
例如,以下邏輯操作將返回布爾值:
25 > 1 && 42 != 7 // true
22 IN [ 23, 42 ] || 23 NOT IN [ 22, 7 ] // true
25 != 25 // false
而以下邏輯操作不會返回布爾值:
1 || 7 // 1
null || "foo" // "foo"
null && true // null
true && 23 // 23
算術運算符
算術運算符對兩個數字操作數執行算術運算。算術運算的結果又是一個數值。
AQL支持以下算術運算符:
+ 加
- 減
* 乘
/ 除
% 取模
還支持一元加號和一元減號:
LET x = -5
LET y = 1
RETURN [-x, +y]
// [5, 1]
對於取冪,有一個數字函數 POW()。
對於字符串連接,您必須使用字符串函數 CONCAT()。將兩個字符串與一個加號運算符("foo" + "bar")結合起來將不起作用!另請參閱常見錯誤。
一些算術運算的例子:
1 + 1
33 - 99
12.4 * 4.5
13.0 / 0.1
23 % 7
-15
+9.99
算術運算符接受任何類型的操作數。將非數字值傳遞給算術運算符將使用TO_NUMBER()函數應用的類型轉換規則將操作數轉換為數字:
null 將被轉換為 0
false將被轉換為0,true將被轉換為1
有效數值保持不變,但NaN和Infinity將轉換為 0
如果字符串值包含數字的有效字符串表示形式,則會將其轉換為數字。字符串開始或結尾的任何空格都會被忽略。任何其他內容的字符串都會被轉換為數字0
一個空數組被轉換為0,一個成員的數組被轉換為其唯一成員的數字表示。有更多成員的數組被轉換為數字 0。
對象/文檔被轉換為數字0。
產生無效值的算術運算,例如1 / 0(除以零)也會產生結果值null。查詢不會中止,但您可能會看到警告。
這裡有一些例子:
1 + "a" // 1
1 + "99" // 100
1 + null // 1
null + 1 // 1
3 + [ ] // 3
24 + [ 2 ] // 26
24 + [ 2, 4 ] // 0
25 - null // 25
17 - true // 16
23 * { } // 0
5 * [ 7 ] // 35
24 / "12" // 2
1 / 0 // 0
三元運算符
AQL還支持可用於條件評估的三元運算符。三元運算符需要一個布爾條件作為它的第一個操作數,如果條件計算結果為真,返回第二個操作數的結果,否則返回第三個操作數。
例子
u.age > 15 || u.active == true ? u.userId : null
三元運算符也有一個簡捷變體,只有兩個操作數。當布爾條件的表達式和返回值應該相同時,可以使用此變體:
例子
u.value ? : 'value is null, 0 or not present'
範圍運算符
AQL支持用..運算符表示簡單的數字範圍。該運算符可用於輕鬆迭代一系列數值。
該..操作者將產生整數值的陣列在所定義的範圍內,與兩個邊界值包括在內。
例子
2010..2013
會產生以下結果:
[ 2010, 2011, 2012, 2013 ]
使用範圍運算符相當於使用範圍邊界指定的範圍內的整數值寫入數組。如果範圍運算符的範圍是非整數,那麼它們將首先轉換為整數值。
還有一個RANGE()函數。
數組運算符
AQL提供數組運算符[*]為 數組變量擴展和 [**]為陣列收縮。
運算符優先級
AQL中的運算符優先級與其他常見語言(最低優先級)類似:
?:三元運算符
|| 邏輯或
&&邏輯和
==,!=平等和不平等
IN
=,>小於,小於等於,大於等於,大於
+,-加法,減法
*,/,%乘法,除法,模數
!,+,-邏輯否定,一元加,一元減
[*] expansion
()函數調用
. 成員訪問
[] 索引值訪問
括號(and)可用於執行不同的操作員評估順序。
閱讀更多 遠荒2018 的文章