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

Supabase中PostgreSQL函数语法错误:WHEN子句附近报错

修复后的PostgreSQL函数代码

你的语法错误源于IN子句中使用SELECT unnest(...)的写法在PL/pgSQL上下文里的解析冲突,同时可以优化CASE表达式的分支逻辑。以下是修复后的完整代码:

CREATE OR REPLACE FUNCTION get_places_by_price(
    price_category_param text[]
)
RETURNS SETOF public.places AS $$
BEGIN
    RETURN QUERY
    SELECT *
    FROM public.places AS place
    WHERE 
        CASE
            WHEN place.price = 0 THEN 'free'
            WHEN place.price <= 1500 THEN '$' 
            WHEN place.price <= 3000 THEN '$$'
            ELSE '$$$' -- 替换原WHEN price>3000,覆盖所有剩余情况
        END = ANY(price_category_param); -- 用ANY替代IN+unnest,符合PostgreSQL数组操作规范
END;
$$ LANGUAGE plpgsql;

关键修改点说明

  • 优化CASE分支逻辑:原代码用WHEN place.price > 3000 THEN '$$$',改为ELSE '$$$',确保所有price值都能匹配到对应类别,避免因未覆盖的数值出现NULL导致筛选失效。
  • 替换数组匹配写法:PostgreSQL中检查值是否存在于数组中,= ANY(数组)是原生高效的写法,比IN (SELECT unnest(数组))更简洁,同时避免PL/pgSQL中的语法解析问题。
  • 可选参数校验(按需添加):如果要防止传入空数组导致全表扫描,可在函数开头加入校验:
    IF price_category_param IS NULL OR array_length(price_category_param, 1) = 0 THEN
        RETURN; -- 也可根据需求抛出错误
    END IF;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:02:37