如何在Supabase中筛选notes表archived列为false或null的行
解决Supabase筛选bool列为false或null的问题
需求
筛选notes表中archived列值为false或null的行,该列类型为bool。
尝试过的无效写法
以下是我尝试过但无法得到正确结果的代码:
Future<List<Cost>> getUnArchivedCosts() async { final dataCost = await supabaseInstance .from('notes') .select<List<Map<String, dynamic>>>() // .is_('archived', null); // 单独使用生效 // .is_('archived', false); // 单独使用生效 // .eq('archived', 'false'); // 生效,但用字符串匹配bool不严谨 // .eq('archived', 'null'); // 无效 // .or('archived.is_.false,archived.is_.null'); // 无效 // .not('archived', 'eq', 'true'); // 无效,会忽略null行 // .not('archived', 'is_', 'true'); // 无效 .or('archived.eq.false,archived.eq.null'); // 无效 }
正确解决方案
方案1:使用or结合is_操作符
正确的or过滤器语法需要明确使用is_操作符匹配null和false,代码如下:
Future<List<Cost>> getUnArchivedCosts() async { final dataCost = await supabaseInstance .from('notes') .select<List<Map<String, dynamic>>>() .or('archived.is_.false,archived.is_.null'); return dataCost.map((e) => Cost.fromJson(e)).toList(); }
方案2:使用not匹配非true值
利用PostgreSQL的逻辑特性,null != true的判断结果为true,因此可以直接筛选archived不为true的行,同时覆盖false和null的情况:
Future<List<Cost>> getUnArchivedCosts() async { final dataCost = await supabaseInstance .from('notes') .select<List<Map<String, dynamic>>>() .not('archived', 'eq', true); return dataCost.map((e) => Cost.fromJson(e)).toList(); }
文档错误说明
Supabase文档中提到的.isFilter方法不存在,实际代码中需使用.is_方法来匹配null或特定值。
内容的提问来源于stack exchange,提问作者Rasputin221
相关产品推荐
相关产品推荐

