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



好的,这是一个有点复杂的

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

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

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

我正在努力扩展并允许每个帖子都有多个状态。但为了实现这一点,我需要弄清楚如何将任何一个seached状态与任何一个posted状态相匹配。

在本例中,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

它将匹配destrongtate中有任何一个状态并且中只有1个状态的帖子

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

dest_state = "mo, ks, ok, ar" 
states = "ks, ne, co"

我需要匹配,因为ks在两个中

但如果它在dest_state和中只有一个状态,我也需要它工作

我的数据库有10万条以上的记录,我们将对此进行搜索

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

您可以使用Postgres"重叠"运算符&&:

SELECT * FROM tbl WHERE dest_state && states;

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

  • 检查Postgres数组中是否存在任何给定的值数组

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

另一种选择是规范化数据库模式,并将其实现为posts和state之间的n:m关系。详细信息:

  • 如何在PostgreSQL中实现多对多关系

相关内容

最新更新