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
相关产品推荐
相关产品推荐

