Postgresql
如何檢查整數數組是否與 int4range 重疊?
PostgreSQL 版本:9.5
我正在嘗試編寫一個查詢,該查詢將檢查指定十年的數組是否在一個範圍內重疊。例如,我想查找 1980 年代或 2000 年代一家公司的所有員工。假設我有兩
date
列:start_date
和end_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])
您可以使用
ANY
和ALL
數組元素量詞,以及@>
包含元素範圍運算符。如果您想知道數組的任何元素是否在您的範圍內,根據您的評論,這就是我解釋您想要的,您可以使用:
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找到這些範例和其他範例