我有这样一个有效的逻辑(属性列的类型是 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"
}
]
如何做到这一点?
提前致谢!
我没有验证代码,所以可能行不通,但我相信至少方向是正确的。您可以使用
.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)
好吧,我找到了为什么它不起作用。 我的 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
}
享受!