2017-04-03 92 views
1

我有以下查詢:檢查數組中是否有任何子串出現在字符串中?

select case when count(*)>0 then true else false end 
from tab 
where param in ('a','b') and position('T' in listofitem)>0 

此檢查是否存在在列listofitem'T'如果確實如此的計數> 0。基本上,它是子串的搜索。

這在這個私人案件中效果很好。不過,我的真實情況是,我有text[]調用sub_array意味着多個值來檢查。如何修改查詢以處理sub_array類型?我更喜歡在查詢中使用它,而不是使用LOOP的函數。

我actualy需要的是:

select case when count(*)>0 then true else false end 
from tab 
where param in ('a','b') and position(sub_array in listofitem)>0 

這因爲sub_array不工作的類型是Text[]

+0

試試' unnest'陣列 –

回答

5

使用unnest() function擴大你的陣列& bool_and()(或bool_or() - 這取決於你想要什麼樣的比賽:所有數組元素,或至少一個)至aggregate

select count(*) > 0 
from tab 
where param in ('a','b') 
and (select bool_and(position(u in listofitem) > 0) 
     from unnest(sub_array) u) 
+0

我認爲你誤解了。 'T'只是一個例子。我需要用sub_array替換它。如果sub_array包含'3a','c','h'比我需要在tab表內搜索這三個字符串。 – avi

+0

@avi主要想法沒有改變。使用unnest擴大彙總總結。實際的公式並不重要。 (我更新了我的答案)。 – pozs

+0

謝謝。在0 ...一個括號附近有太多的語法錯誤。但是,這仍然不適用於所有情況。如果我的行是「28713」 和「-1,37561,37560」。當sub_array ='37588','37560'時它找不到37560.但是,如果sub_array = 37561,37560它可以工作 – avi

0

強力方法是將數組轉換爲字符串:

select (count(*) > 0) as flag 
from tab 
where param in ('a','b') and 
     array_to_string(listofitem, '') like '%T%'; 

我應該注意,比較count(*)不是最有效的方法做這件事。我會建議,而不是:

select exists (select 1 
       from tab 
       where param in ('a','b') and 
        array_to_string(listofitem, '') like '%T%' 
      ) as flag; 

這停止在第一次匹配的邏輯,而不是計算所有匹配的行。

+0

如何將%T%替換爲變量?我不能寫'%sub_array%'。順便說一下,它不會阻止第一場比賽的邏輯。內部查詢將返回包含1的多行。 – avi

相關問題