使用Array搜索数据库以匹配来自另一个Array的单个值

时间:2015-02-18 16:26:50

标签: sql ruby-on-rails database postgresql

好的,这有点复杂

我目前有一个搜索功能,允许客户根据一种或多种状态搜索记录。

他们可以输入多个状态,此功能将搜索帖子以匹配匹配任何一个状态的帖子。

这样,帖子只能有1个状态。

我想扩展并允许每个帖子都有多个状态。但为了实现这一点,我需要弄清楚如何将任何一个连接状态与任何一个已发布状态相匹配。

在此示例type = "dest"states = "mo, ks, ar, ok"

def PrepareSearch.states(type, states)
  states = states.split(",")
  st = ""
  states.each {|s| st += "'#{s}'," }
  st = st[0..-2]
  "#{type}_state IN (#{st})"
end

它会匹配dest_state中包含其中任何一个状态的帖子,其中只有一个在其中

我需要扩展它并匹配这样的东西:

dest_state = "mo, ks, ok, ar" 

states = "ks, ne, co"

我需要匹配,因为ks同时存在

但如果dest_state中只有一个状态

,我也需要它才能工作

我的数据库有100k +记录,这将通过搜索。

dest_state是数据库记录中的存储字段

1 个答案:

答案 0 :(得分:0)

您可以使用Postgres "overlap" operator &&

SELECT * FROM tbl WHERE dest_state && states;

另一个好处是可以在状态数组列上使用 GIN索引支持此运算符。为性能带来巨大的差异。例如:

由于您的表格很大,我会使用intsmallint而不是字符串作为"州"码。或者使用enum

另一种选择是normalize your database schema并将其作为帖子和州之间的n:m关系来实现。详细说明: