【问题标题】:Hstore PostgreSQL Array comparision to any in array, Rails 3Hstore PostgreSQL 数组与任何数组比较,Rails 3
【发布时间】:2015-12-01 04:04:50
【问题描述】:

感谢您的宝贵时间:

我有一组记录(具体是用户),其 Hstore 哈希保存在“数据”字段中。问题是我想创建一个 SQL 来从该组用户中获取用户,并在该“数据”字段中使用 hash hstore 保存的属性匹配另一个字符串值数组,如下所示:

数据:{ "foo" => "", "bar" => "bars", "baz" => "bazz" }

要匹配的字符串数组 ["foos", "bazz"]

注意:我想匹配值,而不是键

每个用户都有一组“数据”foo/bar/bas 属性,我从哈希中发送一个“键”数组以提取并与第二个“值”数组进行比较,但我似乎无法做出单个 SQL 匹配。到目前为止,这就是我所拥有的:

keys = ["foo", "baz"]
values_to_match = ["bars", "bazz"]
users.where("users.data -> ARRAY[?] ILIKE ANY (ARRAY[?])", keys, values_to_match)

【问题讨论】:

    标签: ruby-on-rails arrays postgresql hstore


    【解决方案1】:

    假设您正在为模型 User 编写一个类方法,您可以想到一个简单的 sql 解决方案:

    def self.matched_users(keys, values_to_match)
      result = self
      keys.each_with_index do |key, index|
        result.where("users.data -> ? ILIKE ?", key, "%#{values_to_match[index]}%")
      end
      result
    end
    

    或者如果传递一个哈希

    def self.matched_users(hash)
      hash.inject(users) do |result, (key, value)|
        result = result.where("users.data -> ? ILIKE ?", key, "%#{value}%")
      end
    end
    

    【讨论】:

    • 我会试一试,但没有更优雅的不涉及 ruby​​ 迭代的 SQL 解决方案吗?它更像是一种改进,因为原始查询遍历用户数组并对每个用户进行 SQL 查询,这是非常无效的,并且堆叠 SQL 查询不是很优雅或代码方面我认为,无论如何我都会尝试,它给了我一些方向thanx
    【解决方案2】:

    我找到了一个简单的 SQL 解决方案:

    users.where("(users.data -> ARRAY[?]) && (ARRAY[?])", keys, values_to_match)
    

    似乎数组的交集正确地比较了用户数据字段中的值,即使文档说它返回一个像这样的哈希:

    hstore -> 数组[键] |结果:{“价值”,“价值”}

    感谢所有花时间回答或阅读的人,如果有人能澄清为什么会发生这种情况,我将不胜感激

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 2015-12-28
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多