代码之家  ›  专栏  ›  技术社区  ›  Ragnar

我的Suabase请求中的WHERE子句不起作用

  •  0
  • Ragnar  · 技术社区  · 3 年前

    我发现了Suabase是如何与NextJS一起工作的,并且我能够使用这个Suabase函数从给定地理区域的表中检索结果:

    create or replace function jobs_in_view(min_lat float, min_long float, max_lat float, max_long float)
    returns setof record
    language sql
    as $$
      SELECT *, st_astext(location) AS location
      FROM public.jobs
      WHERE 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);
    

    这段代码运行得很好,但现在,我想添加另一个像合约类型一样的筛选子句,所以我更新了我的函数,如下所示:

    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 contract_type=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, 'contract_type': 'full-time' });
    

    过滤不起作用,并返回边界内的所有结果,但查询忽略了契约的类型。我在编写函数时遗漏了什么?

    1 回复  |  直到 3 年前
        1
  •  0
  •   dshukertjr    3 年前

    由于列名和变量名使用相同的名称,因此需要消除它们的歧义。您可以通过在变量之前添加表名或函数名来实现这一点,如下所示。

    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= jobs_in_view.contract_type
      AND location && ST_SetSRID(ST_MakeBox2D(ST_Point(min_long, min_lat), ST_Point(max_long, max_lat)),4326)
    $$;
    

    注意,在where子句中,我有 jobs.contract_type 一边和 jobs_in_view.contract_type 另一方面。第一个是针对表的列名,第二个是针对函数的变量。