Postgresql查询根据jsonb child过滤掉属性
Postgresql query to filter out based on jsonb child property
我正在对我的 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" = AND "products"."id" = 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,这个是怎么过滤的?
它正在通过过滤器,因为库存中有两个项目。当前过滤器仅过滤掉
时的情况
- 库存中没有物品,或者
- 库存中有一件商品,数量为 0。
当库存中有两个或更多项目时,它不会将其过滤掉。
如果需要过滤掉所有数量为0的情况,需要将过滤器的最后一行改为
.where.not("ARRAY(select distinct (jsonb_each(inventory)).value->>'quantity' as integer)='{0}'")
我正在对我的 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" = AND "products"."id" = 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,这个是怎么过滤的?
它正在通过过滤器,因为库存中有两个项目。当前过滤器仅过滤掉
时的情况- 库存中没有物品,或者
- 库存中有一件商品,数量为 0。
当库存中有两个或更多项目时,它不会将其过滤掉。
如果需要过滤掉所有数量为0的情况,需要将过滤器的最后一行改为
.where.not("ARRAY(select distinct (jsonb_each(inventory)).value->>'quantity' as integer)='{0}'")