【问题标题】:Search for all records that have a particular value using case insensitive in a JSONB array field在 JSONB 数组字段中使用不区分大小写的方式搜索具有特定值的所有记录
【发布时间】:2018-04-30 13:19:11
【问题描述】:

我正在使用 postgres 数据库并尝试在此 JSONB 字段中查询所有带有“Value”=>“Black”的记录。该字段包含一个对象数组,例如{"id"=>"1", "key"=>"size", "value"=>"P"}

如何查询(不区分大小写)这条记录?

这是我目前的代码

def by_feature_value(value)
  relation.where('features @> ?', [{ value: value }].to_json)
end

记录

#<ProductSku:0x000055de9cc01ba8
  id: 33,
  product_id: 3,
  code: "1234",
  ean: "12345",
  created_at: Mon, 30 Apr 2018 11:47:00 UTC +00:00,
  updated_at: Mon, 30 Apr 2018 11:47:00 UTC +00:00,
  features: [{"id"=>"2", "key"=>"Color", "Value"=>"Black"}]>

#<ProductSku:0x000055de9cc01ba8
  id: 33,
  product_id: 3,
  code: "1234",
  ean: "12345",
  created_at: Mon, 30 Apr 2018 11:47:00 UTC +00:00,
  updated_at: Mon, 30 Apr 2018 11:47:00 UTC +00:00,
  features: [{"id"=>"2", "key"=>"Color", "Value"=>"black"}]>,

【问题讨论】:

  • 你需要downcase双方:where('lower(features) @&gt; ?', [{ value: value.downcase }].to_json)。为了提高性能,我建议您在写入时使用downcase value(+ 迁移当前数据),以便稍后您可以假设features 的JSON 中的每个value 都是小写的。

标签: ruby-on-rails postgresql ruby-on-rails-5 jsonb


【解决方案1】:

这个问题的正确答案是

ProductSku.where('lower(features::text)::jsonb @> lower(?)::jsonb', [{ Value: value }].to_json)

如果不进行类型转换,您帖子的第一条评论将不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多