2016-08-10 106 views
3

檢查數組中是否存在一個值非常簡單。例如,以下內容將返回true。檢查Postgres中的數組中是否存在多個值

SELECT 'hello' = ANY(ARRAY['hello', 'bees']) 

但是,如果我想檢查數組中是否存在多個值呢?例如,如果數組中存在'hello'或'bye',我想返回true。我想要做類似

SELECT ['hello', 'bye'] = ANY(ARRAY['hello', 'bees']) 

但這似乎並不奏效。

編輯:

我也期待找出我怎麼能檢查是否有多個值的數組,其中的多重價值有共同的前綴存在。

例如,如果我想在數組中包含任何帶有'hello'前綴的元素時返回true。所以我基本上想要像

SELECT ARRAY['hello%'] && ARRAY['helloOTHERSTUFF'] 

爲true。

+1

'ARRAY [「你好」,「再見」] && ARRAY [「你好」,「蜜蜂']' – Abelisto

+0

謝謝!如果多個值跨越多個具有相同前綴的事物會怎樣?例如,我想匹配數組中以'hello'開頭的任何值。例如,我希望像'ARRAY ['hello'] && ARRAY ['helloOTHERSTUFF']'是真的。我也會編輯原文。 – Vincent

+1

對於任意的東西,您需要使用unnest()將兩個數組轉換爲記錄集,然後根據需要加入它們。你可以使用array()把它變成一個數組。 –

回答

2

爲了檢查是否有任何的數組元素中的另一陣列中使用重疊&&操作者像這樣存在:

SELECT ARRAY[1,4,3] && ARRAY[2,1] -- true 

如果每個數組元素相匹配,你可以使用一個特定的圖案的檢查unnest(anyarray)(提取數組元素)函數結合LIKE or POSIX Regular Expressions(應用模式匹配)和聚合bool_and(expression) - 執行按位AND運算符並返回一行輸出。

測試用例:在單獨的行

我已經把數組元素,以澄清該比較產生正確的,哪些假。

SELECT bool_and(array_elements) 
FROM (
    SELECT unnest(
    ARRAY[ 
    'hello', -- compared with LIKE 'hello%' yields true 
    'helloSOMething', -- true 
    'helloXX', -- true 
    'hell', -- false 
    'nothing' -- false 
    ]) ~~ 'hello%' 
) foo(array_elements); 

因此,如果任何比較產生假,那麼bool_and(array_elements)將返回false。

注:如果你需要你的陣列與之比較的多個模式,你可以用POSIX比較去,並使用|它代表的替代。舉個例子,讓我們說,我們要找出如果數組中的每個元素有兩種hellonot詞開始:

SELECT bool_and(array_elements) 
FROM (
    SELECT unnest(
    ARRAY[ 
    'hello', -- true 
    'helloSOMething', -- true 
    'helloXX', -- true 
    'hell', -- false (doesn't start with neither "hello" nor "not") 
    'nothing' -- true (starts with not) 
    ]) ~ '^hello|not' -- note the use of ~ instead of ~~ as earlier (POSIX vs LIKE) 
) foo(array_elements); 
相關問題