【AQL教程4】AQL中的类型和值顺序

AQL中的类型和值顺序点击此标题看全文

AQL使用一组规则进行等式检查和比较,考虑到数据类型和实际值。

在检查等式或不等式时,或者确定值的排序顺序时,AQL使用一种确定性算法进行比较。

首先,通过数据类型比较操作数,只有当操作数具有相同的数据类型时,才通过数据值比较操作数。

在比较数据类型时,使用以下类型顺序:

null < bool < number < string < array(或list)< object(或document)

这意味着在AQL中,null是最小的类型,而object是具有最高顺序的类型。如果比较的操作数具有不同的类型,则确定比较结果并完成比较。

例如,布尔值true始终小于任何数字或字符串值、任何数组(甚至是空数组)和任何对象。另外,任何字符串值(即使是空字符串)始终大于任何数字值和布尔值(true和false)。

null < false
null < true
null < 0
null < ''
null < ' '
null < '0'
null < 'abc'
null < []
null < {}
false < true
false < 0
false < ''
false < ' '
false < '0'
false < 'abc'
false < []
false < {}
true < 0
true < ''
true < ' '
true < '0'
true < 'abc'
true < []
true < {}
0 < ''
0 < ' '
0 < '0'
0 < 'abc'
0 < []
0 < {}
'' < ' '
'' < '0'
'' < 'abc'
'' < []
'' < {}
[] < {}

如果两个比较的操作数具有相同的数据类型,则比较操作数的值。对于基本类型(null、boolean、number和string),结果定义如下:

null:null等于null
boolean:false小于true
number:数字值按其基数值排序
string:使用本地化比较进行字符串值排序,根据配置的服务器语言使用该语言的字母顺序规则进行排序

注意:与SQL不同,null可以与任何值(包括null本身)进行比较,而不会自动将结果转换为null。

对于复合类型(数组和对象),应用以下特殊规则:

通过按位置逐个比较它们的各个元素来比较两个数组值。对于每个位置,首先比较元素类型。如果类型不相等,则确定比较结果,并完成比较。如果类型相等,则比较两个元素的值。如果一个数组已经结束,而另一个数组在比较的位置仍然有一个元素,则使用null作为完全遍历的数组的元素值。

如果数组元素本身是复合值(数组或对象),则比较算法会递归检查元素的子值。递归比较元素的子元素。

[] < [0]
[1] < [2]
[1, 2] < [2]
[99, 99] < [100]
[false] < [true]
[false, 1] < [false, '']

两个对象操作数通过检查属性名称和值进行比较。首先比较属性名称。在比较属性名称之前,创建一个包含来自两个操作数的所有属性名称的组合数组,并按字典顺序对其进行排序。这意味着在比较两个对象时,声明属性的顺序不相关。

然后,遍历已组合和排序的属性名称数组,并查找两个比较的操作数的相应属性。如果一个对象没有具有所需名称的属性,则将其属性值视为null。最后,使用上述数据类型和值比较比较两个对象的属性值。对所有对象属性执行比较,直到存在明确的比较结果为止。如果找到明确的比较结果,则完成比较。如果没有明确的比较结果,则认为两个比较的对象相等。

{} == { "a": null }

{} < { "a": 1 }
{ "a": 1 } < { "a": 2 }
{ "b": 1 } < { "a": 0 }
{ "a": { "c": true } } < { "a": { "c": 0 } }
{ "a": { "c": true, "a": 0 } } < { "a": { "c": false, "a": 1 } }

{ "a": 1, "b": 2 } == { "b": 2, "a": 1 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值