Postgresql

如何檢查整數數組是否與 int4range 重疊?

  • July 9, 2017

PostgreSQL 版本:9.5

我正在嘗試編寫一個查詢,該查詢將檢查指定十年的數組是否在一個範圍內重疊。例如,我想查找 1980 年代或 2000 年代一家公司的所有員工。假設我有兩date列:start_dateend_date. 到目前為止,這是我最好的嘗試:

SELECT * 
FROM date_table 
WHERE int4range(EXTRACT(DECADE from start_date)::int, 
               EXTRACT(DECADE from end_date)::int) && (int4range(198, 200))

此查詢將檢查在 1980 年代、1990 年代或 2000 年代受僱的任何人。我不想將一個範圍與另一個範圍進行比較;相反,它應該檢查數組中的任何值是否包含在範圍內。我怎樣才能做到這一點?還有另一種方法可以解決這個問題嗎?

更新

感謝 joanolo 的回答,我的工作查詢是:

SELECT * 
FROM date_table 
WHERE int4range(EXTRACT(DECADE from start_date)::int, 
               EXTRACT(DECADE from end_date)::int, '[]') @> ANY(ARRAY[198, 200])

您可以使用ANYALL數組元素量詞,以及@>包含元素範圍運算符。

如果您想知道數組的任何元素是否在您的範圍內,根據您的評論,這就是我解釋您想要的,您可以使用:

SELECT
   int4range(5, 8, '[]') @> ANY(ARRAY[1, 3, 5, 7]) AS some_are_in

(在這種情況下,這將返回 TRUE,因為 5 和 7 都是范圍的一部分)

這幾乎可以翻譯您的請求(但反過來):該範圍是否包含數組的任何元素?


如果你想知道他們在,你會使用ALL而不是ANY

SELECT
   int4range(5, 8, '[]') @> ALL(ARRAY[1, 3, 5, 7]) AS all_are_in

(在這種情況下,這將返回 false,因為 1 和 3不是范圍的一部分)

您可以在此處**的dbfiddle找到這些範例和其他範例

引用自:https://dba.stackexchange.com/questions/179376