跳到主要内容

行和数组比较

当多个值需要作为整体比较时,可构造行或数组。二者不是同一种结构:行可以组合不同类型的字段,数组元素必须有兼容类型。

行的比较​

SELECT ROW(1, 'a') = ROW(1, 'a'); -- true
SELECT ROW(1, 9) < ROW(2, 0); -- true

<、<=、>、>= 对行按字段从左到右比较,遇到第一个不相等的字段便决定结果,不会逐字段同时比较:ROW(1,9) < ROW(2,0) 为真。行相等时,若所有字段相等则真,任何非空字段确定不相等则假,否则可能是未知。ROW(NULL, NULL) IS NULL 为真;行的 IS NULL/IS NOT NULL 并非所有情况都互为反面,部分字段为 NULL 时可都为假。需要空值安全的整体比较可用 IS [NOT] DISTINCT FROM。

数组的比较​

SELECT ARRAY[1, 2] < ARRAY[1, 3]; -- true
SELECT 2 = ANY(ARRAY[1, 2, 3]); -- true
SELECT 2 = ALL(ARRAY[2, 2]); -- true

同类型数组通常按元素顺序作字典序比较;这与 @> 的集合包含语义不同,也不表示长度越长一定越大。多维数组在元素相同的情况下还会考虑维度信息。普通相等比较遇到 NULL 元素可能得到未知。

ANY、ALL 与空数组​

expression operator ANY(array) 只需有一项比较为真,ALL 要求每项为真;空数组上 ANY 为假、ALL 为真。数组本身为 NULL 则结果为 NULL;若没有确定的真/假且某元素是 NULL,结果也可能是未知。不要把 NOT (x = ANY(a)) 与 x <> ALL(a) 理解为忽略空元素的集合差;先决定空值策略,再测试边界。