PostgreSQL如何编写接收数组参数的等效功能判断SQL函数
PostgreSQL 等效数组参数权限判定函数实现
你的JS逻辑核心是按featureA > featureB > featureC的优先级判断入参数组是否包含对应标识,命中第一个匹配项就返回对应的解锁内容,全部不匹配返回空字符串,PostgreSQL可以直接用原生数组类型作为入参,逻辑完全对齐,实现如下:
函数定义
CREATE OR REPLACE FUNCTION unlock_features(abc text[]) RETURNS text AS $$ DECLARE unlock text DEFAULT ''; BEGIN -- 严格对齐原代码判断顺序,命中靠前的规则就直接终止后续判断 IF abc @> ARRAY['featureA'] THEN unlock := 'somethingA'; ELSIF abc @> ARRAY['featureB'] THEN unlock := 'somethingB'; ELSIF abc @> ARRAY['featureC'] THEN unlock := 'somethingC'; END IF; RETURN unlock; END; $$ LANGUAGE plpgsql IMMUTABLE;
注:原JS示例里
return unock是变量名拼写笔误,上述实现已经修正该问题。
调用方式
和JS传数组调用的逻辑完全一致,直接传入text类型数组即可:
-- 对应JS示例里的unlockFeatures(a)调用 SELECT unlock_features(ARRAY['featureA', 'featureB', 'featureC']); -- 返回结果:somethingA,和JS运行结果一致(因为最高优先级的featureA存在,不会走到后续B/C的判断)
关键说明
- 入参类型
text[]是PostgreSQL原生的文本数组类型,对应JS里的字符串数组 - 判断用的
@>是PG原生数组包含运算符,效果等同于JS的Array.includes(),用来判断数组是否包含指定元素 - 标记
IMMUTABLE是因为该函数相同入参永远返回相同结果,开启后PG可以对其做常量折叠、函数索引优化,执行效率更高 - 如果需要调整匹配规则(比如大小写不敏感、模糊匹配),可以把判断条件替换为
'featureA' ILIKE ANY(abc)这类写法,按需扩展即可
内容的提问来源于stack exchange,提问作者Alwaysblue
相关产品推荐
相关产品推荐

