支援的版本: 最新 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2

9.20. 範圍/多重範圍函數和運算子 #

有關範圍型別的概述,請參閱第 8.17 節

表格 9.56 顯示了可用於範圍型別的專用運算子。表格 9.57 顯示了可用於多重範圍型別的專用運算子。除了這些之外,表格 9.1 中顯示的常用比較運算子也適用於範圍和多重範圍型別。比較運算子首先按範圍下限排序,只有在下限相等時才比較上限。多重範圍運算子比較每個範圍,直到有一個範圍不相等。這通常不會產生有用的總體排序,但提供這些運算子是為了允許在範圍上建構唯一索引。

表格 9.56. 範圍運算子

運算子

描述

範例

anyrange @> anyrangeboolean

第一個範圍是否包含第二個範圍?

int4range(2,4) @> int4range(2,3)t

anyrange @> anyelementboolean

範圍是否包含元素?

'[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestampt

anyrange <@ anyrangeboolean

第一個範圍是否被第二個範圍包含?

int4range(2,4) <@ int4range(1,7)t

anyelement <@ anyrangeboolean

元素是否包含在範圍中?

42 <@ int4range(1,7)f

anyrange && anyrangeboolean

範圍是否重疊,即,是否有任何共同的元素?

int8range(3,7) && int8range(4,12)t

anyrange << anyrangeboolean

第一個範圍是否嚴格位於第二個範圍的左側?

int8range(1,10) << int8range(100,110)t

anyrange >> anyrangeboolean

第一個範圍是否嚴格位於第二個範圍的右側?

int8range(50,60) >> int8range(20,30)t

anyrange &< anyrangeboolean

第一個範圍是否未延伸到第二個範圍的右側?

int8range(1,20) &< int8range(18,20)t

anyrange &> anyrangeboolean

第一個範圍是否未延伸到第二個範圍的左側?

int8range(7,20) &> int8range(5,10)t

anyrange -|- anyrangeboolean

範圍是否相鄰?

numrange(1.1,2.2) -|- numrange(2.2,3.3)t

anyrange + anyrangeanyrange

計算範圍的聯集。範圍必須重疊或相鄰,以使聯集為單個範圍(但請參閱 range_merge())。

numrange(5,15) + numrange(10,20)[5,20)

anyrange * anyrangeanyrange

計算範圍的交集。

int8range(5,15) * int8range(10,20)[10,15)

anyrange - anyrangeanyrange

計算範圍的差集。第二個範圍不能以差集不是單個範圍的方式包含在第一個範圍中。

int8range(5,15) - int8range(10,20)[5,10)


表格 9.57. 多重範圍運算子

運算子

描述

範例

anymultirange @> anymultirangeboolean

第一個多重範圍是否包含第二個多重範圍?

'{[2,4)}'::int4multirange @> '{[2,3)}'::int4multiranget

anymultirange @> anyrangeboolean

多重範圍是否包含該範圍?

'{[2,4)}'::int4multirange @> int4range(2,3)t

anymultirange @> anyelementboolean

多重範圍是否包含該元素?

'{[2011-01-01,2011-03-01)}'::tsmultirange @> '2011-01-10'::timestampt

anyrange @> anymultirangeboolean

範圍是否包含該多重範圍?

'[2,4)'::int4range @> '{[2,3)}'::int4multiranget

anymultirange <@ anymultirangeboolean

第一個多重範圍是否被第二個多重範圍包含?

'{[2,4)}'::int4multirange <@ '{[1,7)}'::int4multiranget

anymultirange <@ anyrangeboolean

多重範圍是否被該範圍包含?

'{[2,4)}'::int4multirange <@ int4range(1,7)t

anyrange <@ anymultirangeboolean

範圍是否被該多重範圍包含?

int4range(2,4) <@ '{[1,7)}'::int4multiranget

anyelement <@ anymultirangeboolean

元素是否被該多重範圍包含?

4 <@ '{[1,7)}'::int4multiranget

anymultirange && anymultirangeboolean

多重範圍是否重疊,也就是說,是否有任何共同元素?

'{[3,7)}'::int8multirange && '{[4,12)}'::int8multiranget

anymultirange && anyrangeboolean

多重範圍是否與該範圍重疊?

'{[3,7)}'::int8multirange && int8range(4,12)t

anyrange && anymultirangeboolean

範圍是否與該多重範圍重疊?

int8range(3,7) && '{[4,12)}'::int8multiranget

anymultirange << anymultirangeboolean

第一個多重範圍是否嚴格位於第二個多重範圍的左側?

'{[1,10)}'::int8multirange << '{[100,110)}'::int8multiranget

anymultirange << anyrangeboolean

多重範圍是否嚴格位於該範圍的左側?

'{[1,10)}'::int8multirange << int8range(100,110)t

anyrange << anymultirangeboolean

範圍是否嚴格位於該多重範圍的左側?

int8range(1,10) << '{[100,110)}'::int8multiranget

anymultirange >> anymultirangeboolean

第一個多重範圍是否嚴格位於第二個多重範圍的右側?

'{[50,60)}'::int8multirange >> '{[20,30)}'::int8multiranget

anymultirange >> anyrangeboolean

多重範圍是否嚴格位於該範圍的右側?

'{[50,60)}'::int8multirange >> int8range(20,30)t

anyrange >> anymultirangeboolean

範圍是否嚴格位於該多重範圍的右側?

int8range(50,60) >> '{[20,30)}'::int8multiranget

anymultirange &< anymultirangeboolean

第一個多重範圍是否沒有延伸到第二個多重範圍的右側?

'{[1,20)}'::int8multirange &< '{[18,20)}'::int8multiranget

anymultirange &< anyrangeboolean

多重範圍是否沒有延伸到該範圍的右側?

'{[1,20)}'::int8multirange &< int8range(18,20)t

anyrange &< anymultirangeboolean

範圍是否沒有延伸到該多重範圍的右側?

int8range(1,20) &< '{[18,20)}'::int8multiranget

anymultirange &> anymultirangeboolean

第一個多重範圍是否沒有延伸到第二個多重範圍的左側?

'{[7,20)}'::int8multirange &> '{[5,10)}'::int8multiranget

anymultirange &> anyrangeboolean

多重範圍是否沒有延伸到該範圍的左側?

'{[7,20)}'::int8multirange &> int8range(5,10)t

anyrange &> anymultirangeboolean

範圍是否沒有延伸到該多重範圍的左側?

int8range(7,20) &> '{[5,10)}'::int8multiranget

anymultirange -|- anymultirangeboolean

多重範圍是否相鄰?

'{[1.1,2.2)}'::nummultirange -|- '{[2.2,3.3)}'::nummultiranget

anymultirange -|- anyrangeboolean

多重範圍是否與該範圍相鄰?

'{[1.1,2.2)}'::nummultirange -|- numrange(2.2,3.3)t

anyrange -|- anymultirangeboolean

範圍是否與該多重範圍相鄰?

numrange(1.1,2.2) -|- '{[2.2,3.3)}'::nummultiranget

anymultirange + anymultirangeanymultirange

計算多重範圍的聯集。多重範圍不需要重疊或相鄰。

'{[5,10)}'::nummultirange + '{[15,20)}'::nummultirange{[5,10), [15,20)}

anymultirange * anymultirangeanymultirange

計算多重範圍的交集。

'{[5,15)}'::int8multirange * '{[10,20)}'::int8multirange{[10,15)}

anymultirange - anymultirangeanymultirange

計算多重範圍的差集。

'{[5,20)}'::int8multirange - '{[10,15)}'::int8multirange{[5,10), [15,20)}


當涉及空範圍或多重範圍時,左側/右側/相鄰運算子總是返回 false;也就是說,空範圍不被認為在任何其他範圍之前或之後。

在其他地方,空範圍和多重範圍被視為加法單位元:任何與空值聯集的結果都是自身。任何減去空值的結果也是自身。一個空的多重範圍與一個空的範圍具有完全相同的點。每個範圍都包含空範圍。每個多重範圍都包含任意數量的空範圍。

如果範圍的聯集和差集運算子產生的範圍需要包含兩個不相交的子範圍,由於這樣的範圍無法表示,因此這些運算子將會失敗。有單獨的運算子用於聯集和差集,它們接受多重範圍參數並傳回多重範圍,即使它們的參數不相交也不會失敗。因此,如果您需要對可能不相交的範圍進行聯集或差集運算,您可以先將範圍轉換為多重範圍,以避免錯誤。

表 9.58 顯示了可用於範圍類型的函數。表 9.59 顯示了可用於多重範圍類型的函數。

表 9.58. 範圍函數

函數

描述

範例

lower ( anyrange ) → anyelement

提取範圍的下界(如果範圍為空或沒有下界,則為 NULL)。

lower(numrange(1.1,2.2))1.1

upper ( anyrange ) → anyelement

提取範圍的上界(如果範圍為空或沒有上界,則為 NULL)。

upper(numrange(1.1,2.2))2.2

isempty ( anyrange ) → boolean

範圍是否為空?

isempty(numrange(1.1,2.2))f

lower_inc ( anyrange ) → boolean

範圍的下界是否包含在內?

lower_inc(numrange(1.1,2.2))t

upper_inc ( anyrange ) → boolean

範圍的上界是否包含在內?

upper_inc(numrange(1.1,2.2))f

lower_inf ( anyrange ) → boolean

範圍是否沒有下界?(下界為 -Infinity 會傳回 false。)

lower_inf('(,)'::daterange)t

upper_inf ( anyrange ) → boolean

範圍是否沒有上界?(上界為 Infinity 會傳回 false。)

upper_inf('(,)'::daterange)t

range_merge ( anyrange, anyrange ) → anyrange

計算包含給定兩個範圍的最小範圍。

range_merge('[1,2)'::int4range, '[3,4)'::int4range)[1,4)


表 9.59. 多重範圍函數

函數

描述

範例

lower ( anymultirange ) → anyelement

提取多重範圍的下界(如果多重範圍為空或沒有下界,則為 NULL)。

lower('{[1.1,2.2)}'::nummultirange)1.1

upper ( anymultirange ) → anyelement

提取多重範圍的上界(如果多重範圍為空或沒有上界,則為 NULL)。

upper('{[1.1,2.2)}'::nummultirange)2.2

isempty ( anymultirange ) → boolean

多重範圍是否為空?

isempty('{[1.1,2.2)}'::nummultirange)f

lower_inc ( anymultirange ) → boolean

多重範圍的下界是否包含在內?

lower_inc('{[1.1,2.2)}'::nummultirange)t

upper_inc ( anymultirange ) → boolean

多重範圍的上界是否包含在內?

upper_inc('{[1.1,2.2)}'::nummultirange)f

lower_inf ( anymultirange ) → boolean

多重範圍是否沒有下界?(下界為 -Infinity 會傳回 false。)

lower_inf('{(,)}'::datemultirange)t

upper_inf ( anymultirange ) → boolean

多重範圍是否沒有上界?(上界為 Infinity 會傳回 false。)

upper_inf('{(,)}'::datemultirange)t

range_merge ( anymultirange ) → anyrange

計算包含整個多重範圍的最小範圍。

range_merge('{[1,2), [3,4)}'::int4multirange)[1,4)

multirange ( anyrange ) → anymultirange

傳回一個僅包含給定範圍的多重範圍。

multirange('[1,2)'::int4range){[1,2)}

unnest ( anymultirange ) → setof anyrange

將多重範圍展開為一組依遞增順序排列的範圍。

unnest('{[1,2), [3,4)}'::int4multirange)

 [1,2)
 [3,4)

對於空的範圍或多重範圍,lower_incupper_inclower_infupper_inf 函數都會傳回 false。

提交更正

如果您在文件中發現任何不正確、與特定功能的使用經驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。