使用like搜索数组的每个元素

时间:2017-09-05 05:06:46

标签: sql postgresql

我想就我的问题提供一些专业建议。

您看到我们的数据库正在使用ETL来检索海量数据。这些数据中的一些或大部分是汇总的。

问题是我需要根据选定的电台检索数据

例如。我选择了Sub test() Dim xhr As MSXML2.XMLHTTP60 Dim doc As MSHTML.HTMLDocument Dim results As MSHTML.HTMLDivElement Dim elt As MSHTML.HTMLTableCell Dim imgs As MSHTML.IHTMLElementCollection Dim img As MSHTML.HTMLImg Set xhr = New MSXML2.XMLHTTP60 With xhr .Open "GET", "https://api.restb.ai/segmentation client_key=c529e4cb36fd71a0038e5790fd69a42eacaf378fa0789bba78b9782e073b88ed&model_id=re_features&image_url=https://www.mulderteam.com/wp-content/blogs.dir/234/files/2013/04/110922317.jpg", False .send If .readyState = 4 And .Status = 200 Then Set doc = New MSHTML.HTMLDocument doc.body.innerHTML = .responseText End If End With End Sub

现在,在聚合列中,我们有以下数组:

MNL

现在,根据我选择的代码(MNL),我应该只能从数组中选择以下元素。

{MNL-CEB,CEB-MNL,DVO-MNL,MNL-DVO,DVO-CEB,CEB-DVO}

我一直在尝试各种条件但没有成功。希望你们能帮助我。谢谢!

这是我在下面使用过的一段代码 -

MNL-CEB,
CEB-MNL,
DVO-MNL,
MNL-DVO

数据太大而不适合,导致脚本加载更多。

修改 - 我还使用了超过1个电台代码。例如 select distinct unnest(fpd.segment_agg) segments from daylightreport.f_dailysales_agg fpd 或类似的东西。

提前致谢!

1 个答案:

答案 0 :(得分:0)

避免被取消的一种方法是将数组转换为字符串,然后对该字符串进行正则表达式匹配:

select *
from daylightreport.f_dailysales_agg fpd
where array_to_string(fpd.segment_agg, ',') ~ '(-){0,1}(MNL)(-){0,1}';

正则表达式确保搜索字符串不会显示为另一个字符串的一部分。如果这种情况无论如何都不会发生,那么一个简单的事情也可能会发生。这也假设数据从不包含,

虽然快,但避免了多行中的取消。

另一个选项(尽管可能不是那么快)是编写一个遍历数组元素并使用LIKE运算符的函数:

create or replace function any_element_like(p_elements text[], p_pattern text)
  returns boolean
as
$$
declare
   l_word text;
begin
  foreach l_word in array p_elements 
  loop
    if l_word like p_pattern then 
      return true;
    end if;
  end loop;
  return false;
end;
$$
language plpgsql;

可以这样使用:

select *
from daylightreport.f_dailysales_agg fpd
where any_element_like(fpd.segment_agg, '%MNL%');