【问题标题】:Postgresql query to filter out based on jsonb child property基于 jsonb 子属性过滤掉的 Postgresql 查询
【发布时间】:2020-11-11 08:37:43
【问题描述】:

我正在我的 rails 应用程序上编写一个长查询,其中一部分(最后一个 .where.not 是库存列的数量属性在其条目上不等于 0)不起作用。我当前的查询如下所示:

@products = @products.offset(offset).limit(@limit)
.where(status: "visible")
.where("add_to_inventory =? OR (add_to_inventory =? AND inventory !=? )", false, true, '{}')
.where.not("ARRAY(select (jsonb_each(inventory)).value->>'quantity' as integer)='{0}'")

但是,在我生成的产品数组中,产品 14 设法通过了此过滤,产品 14 看起来像这样。

2.4.6 :001 > Product.find(14)
  Product Load (0.8ms)  SELECT  "products".* FROM "products" WHERE "products"."deleted" = $1 AND "products"."id" = $2 LIMIT 1  [["deleted", "f"], ["id", 14]]
 => #<Product id: 14, deleted: false, category_id: 11, created_at: "2020-10-26 10:27:22", updated_at: "2020-11-10 16:26:11", final_price: 2342.0, status: 0, inventory: {"fsaf"=>{"sku"=>"", "barcode"=>"", "quantity"=>"0"}, "werwe"=>{"sku"=>"", "barcode"=>"", "quantity"=>"0"}}, add_to_inventory: true>

可以看到库存数量为0,这是怎么通过过滤器的?

【问题讨论】:

    标签: sql ruby-on-rails postgresql ruby-on-rails-4 ruby-on-rails-5


    【解决方案1】:

    它正在通过过滤器,因为库存中有两件物品。当前过滤器仅在以下情况下过滤掉案例

    1. 库存中没有物品,或
    2. 库存中有一件,数量为 0。

    当库存中有两个或更多物品时,它不会将其过滤掉。

    如果您需要过滤掉所有个数量为0的情况,您需要将过滤器的最后一行更改为

    .where.not("ARRAY(select distinct (jsonb_each(inventory)).value->>'quantity' as integer)='{0}'")
    

    【讨论】:

    • 再次感谢!您有什么资源可以推荐给我研究这些查询吗?
    • 我通常使用postgresql.org/docs/13/functions-json.html加上stackoverflow搜索。然后在 db 控制台(rails dbpsql)中进行大量试验,以使查询进入工作状态。在我得到正确的查询之前,我经历了很多试验和错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2016-10-31
    • 1970-01-01
    相关资源
    最近更新 更多