You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Supabase自定义SQL函数新增合同类型过滤条件失效问题

问题原因

你的SQL函数存在标识符命名冲突:函数参数名contract_type和jobs表的列名contract_type完全一致,导致WHERE子句里的contract_type=contract_type被解析为「列值等于自身」,这个条件永远为真,所以合同类型过滤完全失效。

解决方法

有两种简单的修复方式:

方式1:修改参数名避免冲突

给函数参数加前缀(比如p_代表parameter),同时更新WHERE条件:

create or replace function jobs_in_view(min_lat float, min_long float, max_lat float, max_long float, p_contract_type varchar)
returns setof record
language sql
as $$
  SELECT *, st_astext(location) AS location
  FROM public.jobs
  WHERE contract_type = p_contract_type
  AND location && ST_SetSRID(ST_MakeBox2D(ST_Point(min_long, min_lat), ST_Point(max_long, max_lat)),4326)
$$;

同步更新前端调用的参数名:

const { data: jobs } = await supabase.rpc('jobs_in_view', { ...bounds, 'p_contract_type': 'full-time' });

方式2:用表名限定列名

不用改参数名,明确指定是jobs表的列:

create or replace function jobs_in_view(min_lat float, min_long float, max_lat float, max_long float, contract_type varchar)
returns setof record
language sql
as $$
  SELECT *, st_astext(location) AS location
  FROM public.jobs
  WHERE jobs.contract_type = contract_type
  AND location && ST_SetSRID(ST_MakeBox2D(ST_Point(min_long, min_lat), ST_Point(max_long, max_lat)),4326)
$$;
额外建议
  • 写SQL函数时,尽量给参数加统一前缀(如p_、param_),避免和表列名、内置函数名冲突,提升代码可读性。
  • 如果jobs表结构固定,建议把函数返回类型从setof record改为setof jobs,这样Supabase返回的数据结构更明确,前端处理更方便:
create or replace function jobs_in_view(min_lat float, min_long float, max_lat float, max_long float, p_contract_type varchar)
returns setof jobs
language sql
as $$
  SELECT *, st_astext(location) AS location
  FROM public.jobs
  WHERE contract_type = p_contract_type
  AND location && ST_SetSRID(ST_MakeBox2D(ST_Point(min_long, min_lat), ST_Point(max_long, max_lat)),4326)
$$;

内容的提问来源于stack exchange,提问作者Ragnar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:05:22