如何在PostgreSQL中替换Oracle的BITAND与DECODE函数?
Oracle BITAND+DECODE转PostgreSQL的正确写法
原Oracle语句逻辑:判断p.privilege与2的按位与结果是否为2,是则返回'true',否则返回'false'。
你的尝试语句存在问题:((p.privilege & 2 = 2))::int是将布尔值(p.privilege & 2 = 2的结果是true/false)转为整数,PostgreSQL中布尔true转int是1,false是0,所以when 2永远不会匹配,只会走到else分支返回'false'。
以下是几种正确的替换方案:
方案1:标准CASE语句(最直观)
SELECT CASE WHEN p.privilege & 2 = 2 THEN 'true' ELSE 'false' END AS is_approver FROM person p;
方案2:简化CASE写法
SELECT CASE (p.privilege & 2) WHEN 2 THEN 'true' ELSE 'false' END AS is_approver FROM person p;
方案3:利用布尔值转文本(更简洁)
PostgreSQL中布尔值可以直接转为'true'/'false'格式的字符串,所以可以直接将判断结果转换后使用:
SELECT CAST((p.privilege & 2 = 2) AS TEXT) AS is_approver FROM person p;
或者用更简洁的写法:
SELECT (p.privilege & 2 = 2)::TEXT AS is_approver FROM person p;
这几种写法都能实现原Oracle语句的逻辑,其中方案3最简洁,推荐使用。
内容的提问来源于stack exchange,提问作者user2400551
相关产品推荐
相关产品推荐

