通过 Supabase 选择 JSONB 过滤器

问题描述 投票:0回答:2

我有这样一个有效的逻辑(属性列的类型是 JSONB - 对象数组):

但是如果 Trait_type 相等,我想在这里实现逻辑“或”...而不是“与”:

JSONB的列结构:

[
   {
      "value":"Standard Issue Armor 1 (Purple)",
      "trait_type":"Clothes"
   },
   {
      "value":"Standard Issue Helmet 1 (Red)",
      "trait_type":"Full Helmet"
   },
   {
      "value":"Chrome",
      "trait_type":"SmartSkin"
   },
   {
      "value":"Base Drone (Blue)",
      "trait_type":"Drone"
   },
   {
      "value":"Thick",
      "trait_type":"Eyebrows"
   }
]

如何做到这一点?

提前致谢!

postgresql jsonb supabase
2个回答
3
投票

我没有验证代码,所以可能行不通,但我相信至少方向是正确的。您可以使用

.or()
过滤器通过逻辑或运算符连接多个过滤器。对于
contains()
,您可以在 或 过滤器中使用
cs
关键字,如下所示:

const { data, error } = await supabase.from('NTFs')
  .select('name, id_in_collection, owner_address')
  .eq('collection_id', Number(id))
  .contains('attributes', JSON.stringify([{trait_type: 'SmartSkin', value: 'Chrome'}]))
  .or(`attributes.cs.${JSON.stringify([{trait_type: 'Drone', value: 'Armed Drone (Blue)'}])}`, `attributes.cs.${JSON.stringify([{trait_type: 'Drone', value: 'Armed Drone (Green)'}])}`)
  .order('id_in_collection')
  .range(fromIndex, toIndex)

0
投票

好吧,我找到了为什么它不起作用。 我的 Jsonb 被定义为数组避免它。

其次,我想通过不同的运算符过滤值,所以我创建了一个函数

这个函数现在是动态的,我可以在我的代码中使用supabase RPC调用它

这是我的职责:

CREATE OR REPLACE FUNCTION get_maintenances(
  search_column text,
  search_operator text,
  search_value text
) RETURNS SETOF maintenances AS $$
BEGIN
  RETURN QUERY EXECUTE format(
    'SELECT m.*
     FROM maintenances m
     CROSS JOIN jsonb_array_elements(m.values) as fields
     WHERE fields->>%L %s %L',
     search_column, search_operator, search_value
  );
END;
$$ LANGUAGE plpgsql;

将“maintenances”替换为您的表名称,将 m.“values”替换为您的列名称,并根据您的意愿命名。

现在您可以在代码中执行它了

const fetchMaintenances = async () => {
    const {data, error} = await supabase.rpc("get_maintenances", {
      search_column: "value",
      search_operator: "ilike",
      search_value: "f%"
    })
    return data
  }

享受!

© www.soinside.com 2019 - 2024. All rights reserved.