Oracle迁移PostgreSQL:decode转CASE语句的正确性咨询
问题分析与修正
你的改写方向完全正确,PostgreSQL确实没有decode()函数,用CASE语句替代是标准方案。但当前改写的语句存在语法错误,同时可以确认else 4的写法完全符合原Oracle逻辑。
原Oracle逻辑解析
原decode(upper(code), 'EUR', 1, 'GBP', 2, 'USD', 3, 4)的逻辑是:
- 当
upper(code)等于'EUR'时,返回1 - 等于
'GBP'时返回2 - 等于
'USD'时返回3 - 其他所有情况返回4,作为排序的默认权重
改写语句的问题
你写的PostgreSQL语句缺少CASE语句的结束标记END,PostgreSQL要求CASE必须以END收尾,否则会触发语法错误。
正确的PostgreSQL改写语句
"SELECT CODE " + "FROM SCHEMA.TABLE_NAME " + "WHERE TYPE='CURRENCIES' " + "ORDER BY case upper(code) " + "when 'EUR' then 1 " + "when 'GBP' then 2 " + "when 'USD' then 3 " + "else 4 " + "END";
验证说明
else 4的写法完全正确:和原Oracledecode()的默认值逻辑完全一致,所有未匹配到EUR/GBP/USD的code都会以权重4排序upper(code)的用法兼容:PostgreSQL的upper()函数和Oracle的同名函数行为一致,都是将字符串转为大写- 排序逻辑等价:修正后的语句排序结果和原Oracle查询完全相同
内容的提问来源于stack exchange,提问作者Euridice01
相关产品推荐
相关产品推荐

